Sagen wir, ich habe eine Klasse wie diese:
class A {
public:
A( SomeHugeClass* huge_object)
: m_huge_object(huge_object) {}
private:
SomeHugeClass* m_huge_object;
};
Wenn jemand den Konstruktor auf diese Weise verwendet:
A* foo = new A(new SomeHugeClass());
Wer ist dafür verantwortlich, das im Konstruktor neu angelegte Objekt zu löschen? In diesem Fall kann der Bereich, in dem der A-Konstruktor aufgerufen wurde, nur foo löschen, da die SomeHugeClass anonym ist.
Was aber, wenn jemand den Konstruktor wie folgt verwendet?
SomeHugeClass* hugeObj = new SomeHugeClass();
A* foo = new A(hugeObj);
Dann kann der Aufrufer delete hugeObj an einem bestimmten Punkt aufrufen, richtig?
Gibt es bei dieser Implementierung von A ein Speicherleck bei der Zerstörung?
Ich arbeite an einem Projekt, bei dem viele Objekte auf diese Weise komponiert werden, und so gerne ich auch intelligente Zeiger verwenden würde, muss ich mit den Projektleitern darüber sprechen, wie ich den alten Code ändern kann, um die Vorteile zu nutzen, bevor ich das kann.