Pourquoi il n'y a pas de placement de supprimer l'expression en C++?
Pourquoi C++ n'a pas de placement de supprimer directement correspond à l'implantation de nouvelles, c'est à dire appelle le destructeur et les appels de les placer à l'opérateur d'effacement?
Par exemple:
MyType *p = new(arena) MyType;
...
//current technique
p->~MyType();
operator delete(p, arena);
//proposed technique
delete(arena) p;
- ne pas supprimer automatiquement appeler le destructeur?
- Pour les objets créés avec la mise en place de nouvelles non, il n'est pas
- Salut, je sais que ça fait un bout de temps, mais c'est une très bonne question et les réponses étaient tous de la marque. Ce genre de chose ne devrait pas être sujet de s'excuser pour les défauts ou la rationalisation pourquoi du comité de la norme ne doit pas avoir voulu quelque chose simplement parce qu'il n'y est pas.
- question connexe: stackoverflow.com/questions/6783993/placement-new-and-delete
- C++ de Stroustrup FAQ: Est-il un "placement supprimer"?
- Je suis d'accord c'est une bonne question, je suis juste deviner pourquoi spéculative des réponses parfois refusé et parfois accepté, semble il y a quelque chose comme une Élite ou d'une Mafia là, parfois >)
Vous devez vous connecter pour publier un commentaire.
operator delete
est unique dans la vie d'un non-membre ou une fonction membre statique que dynamique est distribué. Un type avec un destructeur virtuel effectue l'appel à sa propredelete
de la plupart des dérivés destructeur.(Exécutez cet exemple.)
Pour que cela fonctionne avec le placement de supprimer, de le destructeur aurait en quelque sorte passer les arguments supplémentaires à
operator delete
.operator delete
surcharge avec des arguments différents.operator delete
doit être appelé. Mais si le destructeur n'recherche, il rencontre le même problème d'exiger virtuels multiples définitions de fonction en tant que #1. Une sorte de résumé de surcharge mis en aurait à être créée, à laquelle l'appelant aurait à résoudre.Vous avez un parfaitement bon point, et il serait un ajout intéressant à la langue. Rénovation dans l'existant sémantique de
delete
est sans doute encore possible, en théorie. Mais la plupart du temps, nous ne pas utiliser toutes les fonctionnalités dedelete
et il suffit d'utiliser un pseudo-destructeur d'appel suivi par quelque chose commearena.release(p)
.delete (args...) pointer;
ne pouvait pas être simplement résolu par ex.pointer->~T(); operator delete(pointer, args...);
(qui est, le deleter fonction pas être appelée à partir de l'destructeur directement, comme je présume que vous le suggérez, mais plutôt un appel à la deleter serait introduit par le compilateur juste après le destructeur d'appel).pointer
n'est pas ce qui doit être transmis àoperator delete
. Au lieu de cela il a besoin d'underived_pointer
. Le problème est résoluble, mais seulement avec un peu de complexité.Car il n'y a pas besoin de le faire, car nous avons déjà
ptr->~type();
ptr->~type()
vous obtenez seulement un appel au destructeur. Il n'y a pas d'appel correspondant à une fonction de libération. Peut-être que vous pouvez améliorer votre réponse afin de vous expliquer où nous pouvons suivre que la mémoire de " ptr " est maintenant disponible pour être réutilisé.p->~type()
- pour détruire l'objet - etoperator delete (p, arena)
- pour gérer la mémoire. Vous pouvez répondre, il suffit de détruire l'objet et la mémoire seront traitées par????? Vous êtes sûr que c'est me qui a mal compris la question?p->~type()
. Que faites-vous avec la mémoire qui est à gauche est vous. La réutilisation ou le gratuit.dynamic_cast<void*>(ptr)
peut vous apporter un pointeur vers la plupart des dérivés de l'objet.dynamic_cast
.void*
argument non modifiée. Vous utilisez ces deux indirectement à construire un objet sur un précédemment alloué partie de la mémoire. Dans GCC, vous n'êtes PAS autorisé à la surcharge de ces deux opérateurs.Probablement parce qu'il était syntaxe pour appeler explicitement un destructeur sans libération de la mémoire (exactement comme dans votre question), mais pas de syntaxe pour la construction explicite de la mémoire brute?
arena
objet). Mais cette réponse n'est pas de tirer la moindre connexion entre la construction et la destruction, le point n'est pas clair.En fait il y a un placement de supprimer ce qui est appelé par la mise en œuvre d'un objet qui a été "attribués" à l'aide de placement de nouveau, si le constructeur a déclenché une exception.
À Partir De Wikipedia.
Le point entier de placement de nouveau, c'est de séparer la création d'objet à partir de sa gestion de la mémoire. Donc, il ne fait aucun sens de l'attacher en arrière lors de la destruction de l'objet.
Si la mémoire pour les objets du tas et vous voulez la même durée de vie des objets et de leur mémoire suffit d'utiliser
operator new
etoperator delete
, peut-être que leur remplaçant, si vous voulez un comportement spécial.Le Placement de nouveau, c'est bon pour l'exemple de vecteur, qui conserve une grande partie de la mémoire brute et crée et détruit des objets à l'intérieur d'elle, mais sans la libération de la mémoire.