271 votes

C++ : Supprimer cet élément ?

Est-il possible de si l’instruction delete est la dernière instruction qui sera exécutée sur cette instance de la classe ? Bien sûr, je suis sûr que -l’instance de la classe est `` ly-créé.

Je pense à quelque chose comme ceci :

Ou peut-être en utilisant une méthode auxiliaire :

265voto

JaredPar Points 333733

Le C++ FAQ Lite comporte une entrée spécifiquement pour cela

Je pense que cette citation résume bien

Tant que vous êtes prudent, c’est OK pour un objet de se suicider (supprimer cet élément).

104voto

Jerry Coffin Points 237758

Oui, delete this; a défini les résultats, aussi longtemps que (comme vous l'avez remarqué) vous assurer que l'objet a été alloué dynamiquement, et (bien sûr) ne tentez jamais d'utiliser l'objet après qu'il soit détruit.

Certains considèrent cela comme un vilain hack, et de dire à quelqu'un qui vous écoute et qu'il devrait être évitée. On cite souvent des problème est la difficulté de veiller à ce que les objets de la classe ne sont jamais alloué dynamiquement. D'autres considèrent qu'il est parfaitement raisonnable de l'idiome, et de l'utiliser tout le temps. Personnellement, je suis quelque part au milieu: j'ai rarement l'utiliser, mais n'hésitez pas à le faire quand il semble être le bon outil pour le travail.

Edit: [le plus souvent en réponse à @Alexandre C commentaire]: la première fois que vous faites c'est avec un objet qui a une durée de vie qui est presque entièrement son propre. Un exemple James Kanze a cité l'une de facturation/système de suivi, il a travaillé pour une compagnie de téléphone. Fondamentalement, lorsque vous décrochez le téléphone, quelque chose prend note et crée un phone_call objet. À partir de ce moment, l' phone_call objet gère les détails de l'appel (d'une connexion lorsque vous composez, l'ajout d'une entrée dans la base de données-à-dire lorsque l'appel a commencé, éventuellement raccorder plus de gens, si vous effectuez un appel de conférence, etc.) Lorsque vous raccrochez, l' phone_call objet est sa dernière tenue de la comptabilité (par exemple, ajoute une entrée à la base de données-à-dire lorsque vous avez raccroché, de sorte qu'ils peuvent calculer combien de temps votre appel), puis détruit lui-même. La durée de vie de l' phone_call objet est basé sur lorsque vous décrochez/raccrochez le téléphone -- du point de vue du reste du système, en gros, c'est totalement arbitraire, de sorte que vous ne pouvez pas attacher à tout portée lexicale dans le code, ou quoi que ce soit sur cet ordre.

Pour quelqu'un qui pourrait se soucient de fiabilité de ce type de codage peut être: si vous faites un appel téléphonique à, partir de, ou à travers presque toutes les parties de l'Europe, il y a une très bonne chance que c'est d'être manipulé (au moins en partie) par le code qui fait exactement cela.

51voto

Mark Ransom Points 132545

Si elle vous fait peur, il y a une entaille parfaitement légale :

Je pense que `` est idiomatique C++ si, et seulement, je présente cela comme une curiosité.

27voto

Bob Bryan Points 1312

L'une des raisons que le C++ a été conçu a été de le rendre facile à réutiliser le code. En général, C++ doit être écrit afin qu'il fonctionne si la classe est instanciée sur le tas, dans un tableau, ou sur la pile. "Supprimer ce" est une très mauvaise pratique de codage, car il ne fonctionnera que si une seule instance est définie sur le tas; et il vaut mieux ne pas être une autre instruction delete, qui est généralement utilisé par la plupart des développeurs de nettoyer le tas. En faisant cela suppose également qu'aucune maintenance n'programmeur dans le futur, à guérir un mal perçu fuite de mémoire en ajoutant une instruction delete.

Même si vous savez à l'avance que votre plan actuel est de n'attribuer à une instance unique sur le tas, que si quelques happy-go-lucky développeur vient à l'avenir et décide de créer une instance sur la pile? Ou, si il coupe et colle à certaines parties de la classe à une nouvelle classe qu'il a l'intention d'utiliser sur la pile? Lorsque le code atteint "supprimer ce" il vont le supprimer, mais ensuite, lorsque l'objet est hors de portée, il va appeler le destructeur. Le destructeur va alors essayer de le supprimer à nouveau et vous êtes ensuite arrosé. Dans le passé, de faire quelque chose comme ce serait gâcher non seulement le programme, mais le système d'exploitation et l'ordinateur devra être redémarré. En tout cas, ce n'est PAS fortement recommandé et devrait presque toujours être évitée. Je dois être désespéré, au sérieux de plâtre, ou vraiment la haine de la société, j'ai travaillé pour l'écriture du code qui fait cela.

24voto

Kirill V. Lyadvinsky Points 47627

Il est permis (juste ne pas utiliser l’objet après cela), mais je ne voudrais pas écrire tel code sur la pratique. Je pense que devrait apparaître uniquement dans des fonctions qui ont appelé ou et ressemble à : .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X