Intelligente Zeiger auf Kinder
Die Smart Pointer Klassen std::unique_ptrund std::shared_ptrdienen der Speicherverwaltung. Mit einem solchen intelligenten Zeiger bedeutet, dass Sie besitzen den Zeiger. Wenn Sie jedoch einen QObjectoder 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 QObjectElement 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_ptrauf das Objekt. Auf diese Weise erhalten Sie Ressourcensicherheit. Wenn Sie das Objekt später einem übergeordneten Objekt übergeben, QObjectkö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.