Intelligente Zeiger auf Kinder
Die Smart Pointer Klassen std::unique_ptr
und std::shared_ptr
dienen der Speicherverwaltung. Mit einem solchen intelligenten Zeiger bedeutet, dass Sie besitzen den Zeiger. Wenn Sie jedoch einen QObject
oder einen abgeleiteten Typ mit einem QObject
übergeordneten Element erstellen , wird das Eigentum (die Verantwortung für die Bereinigung) an das übergeordnete Element übergeben QObject
. In diesem Fall sind die intelligenten Zeiger der Standardbibliothek unnötig oder sogar gefährlich, da sie möglicherweise zu einer doppelten Löschung führen können. Huch!
Rohe Zeiger auf Waisenkinder
Wenn jedoch ein QObject
(oder ein abgeleiteter Typ) auf dem Heap ohne übergeordnetes QObject
Element erstellt wird, sind die Dinge sehr unterschiedlich. In diesem Fall sollten Sie nicht nur einen Rohzeiger halten, sondern einen intelligenten Zeiger, vorzugsweise einen std::unique_ptr
auf das Objekt. Auf diese Weise erhalten Sie Ressourcensicherheit. Wenn Sie das Objekt später einem übergeordneten Objekt übergeben, QObject
können Sie Folgendes verwenden std::unique_ptr<T>::release()
:
auto obj = std::make_unique<MyObject>();
QObject parentObject;
obj->setParent( &parentObject );
obj.release();
Wenn das, was Sie tun, bevor Sie Ihrem Waisenkind ein Elternteil geben, eine Ausnahme auslöst, liegt ein Speicherverlust vor, wenn Sie den Rohzeiger zum Halten des Objekts verwenden. Der obige Code ist jedoch gegen ein solches Leck geschützt.
Allgemeiner gesagt
Es ist kein moderner C ++ - Rat, Rohzeiger insgesamt zu vermeiden, sondern zu vermeiden, Rohzeiger zu besitzen . Ich könnte einen weiteren modernen C ++ - Rat hinzufügen: Verwenden Sie keine intelligenten Zeiger für Objekte, die einer anderen Programmentität gehören.