dire donc j'ai une classe comme ceci:Membres des données C++ Pointer: Qui devrait les supprimer?
class A {
public:
A(SomeHugeClass* huge_object)
: m_huge_object(huge_object) {}
private:
SomeHugeClass* m_huge_object;
};
Si quelqu'un utilise le constructeur comme ceci:
A* foo = new A(new SomeHugeClass());
la responsabilité de qui est-il d'appeler supprimer sur l'objet newed dans le constructeur? Dans ce cas, la portée dans laquelle le constructeur A a été appelé ne peut supprimer que foo puisque SomeHugeClass est anonyme.
Cependant, que se passe-t-il si quelqu'un utilise le constructeur comme ça?
SomeHugeClass* hugeObj = new SomeHugeClass();
A* foo = new A(hugeObj);
Ensuite, l'appelant peut appeler supprimer énormeObj à un moment donné, non?
Est-ce que cette implémentation de A fuite mémoire sur la destruction? Je travaille sur un projet avec beaucoup de composition d'objet fait de cette façon et autant que j'aimerais utiliser des pointeurs intelligents, je dois parler au projet conduit à changer de code ancien pour en profiter avant Je peux.
Vous devez 'hugeObj' dans l'initialisation de votre dernier extrait de code; Dans le cas contraire, vous risquez de rencontrer un comportement indéfini lorsque vous utiliserez 'foo'. – Gorpik
^Bonne prise. Modifier cela. – RyanG
Personne ne peut dire qui devrait supprimer les membres du pointeur dans votre cas: nous manquons de contexte pour répondre de manière fiable. Je pense que cela dépend de ce que fait votre classe et de ce qu'elle représente. Il peut s'agir d'une classe qui fait référence à des données externes et dont la documentation spécifie que sa durée de vie ne doit pas dépasser la durée de vie des données référencées. Ou il pourrait juste prendre la propriété. – ereOn