Ich bin ziemlich neu in Qt und wundere mich über einige grundlegende Dinge mit Speicherverwaltung und dem Leben von Objekten. Wann muss ich meine Objekte löschen und / oder zerstören? Wird dies automatisch erledigt?
Welche der von mir erstellten Objekte muss ich im folgenden Beispiel löschen? Was passiert mit der Instanzvariablen, myOtherClass
wenn sie myClass
zerstört wird? Was passiert, wenn ich meine Objekte überhaupt nicht lösche (oder zerstöre)? Wird das ein Problem für das Gedächtnis sein?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Wie Sie sehen, ist dies ein ziemlich einfaches Zeug für Anfänger, aber wo kann ich auf einfache Weise davon erfahren?
(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> Dies ist nicht der Grund, warum es sicher ist. In Qt 4.7.4 werden QObject-Kinder direkt gelöscht (viadelete
, siehe qobject.cpp, Zeile 1955). Der Grund, warum es sicher ist, untergeordnete Objekte zuerst zu löschen, besteht darin, dass ein QObject sein übergeordnetes Objekt anweist, es zu vergessen, wenn es gelöscht wird.ClassB
erbt vonQObject
undClassC
erbt vonClassB
,ClassC
wird es von Qts Eltern-Kind-Beziehung nur dann ordnungsgemäß zerstört, wennClassB
der Destruktor virtuell ist.Ich möchte Debilskis Antwort erweitern, indem ich darauf hinweise, dass das Konzept des Eigentums in Qt sehr wichtig ist. Wenn Klasse A das Eigentum an Klasse B übernimmt, wird Klasse B gelöscht, wenn Klasse A gelöscht wird. Es gibt verschiedene Situationen, in denen ein Objekt Eigentümer eines anderen wird, nicht nur, wenn Sie ein Objekt erstellen und dessen übergeordnetes Objekt angeben.
Zum Beispiel:
Ein anderes Beispiel:
Überprüfen Sie die Dokumentation daher häufig. Sie gibt im Allgemeinen an, ob eine Methode den Besitz eines Objekts beeinflusst.
Wie von Debilski angegeben, gelten diese Regeln NUR für Objekte, die von QObject abgeleitet sind. Wenn Ihre Klasse nicht von QObject abgeleitet ist, müssen Sie die Zerstörung selbst erledigen.
quelle
Das übergeordnete Objekt (entweder das QObject-Objekt oder seine abgeleitete Klasse) verfügt über eine Liste mit Zeigern auf seine untergeordneten Elemente (QObject / seine abgeleitete Klasse). Das übergeordnete Objekt löscht alle Objekte in seiner untergeordneten Liste, während das übergeordnete Objekt zerstört wird. Mit dieser Eigenschaft von QObject können Sie untergeordnete Objekte automatisch löschen lassen, wenn das übergeordnete Objekt gelöscht wird. Die Beziehung kann mit dem folgenden Code hergestellt werden
Es gibt andere Möglichkeiten, den Speicher in Qt mithilfe von Smartpointer zu verwalten. Der folgende Artikel beschreibt verschiedene intelligente Zeiger in Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
quelle
Um diese Antworten zu ergänzen, würde ich Ihnen zur Überprüfung empfehlen, eine
Visual Leak Detetor
Bibliothek für Ihre Visual C ++ - Projekte zu verwenden, einschließlich Qt-Projekten, da diese Bibliothek auf C ++ basiert, mitnew, delete, free and malloc
Anweisungen kompatibel ist, gut dokumentiert und einfach zu verwenden ist. Vergessen Sie nicht, dass Sie beim Erstellen Ihrer eigenenQDialog
oderQWidget
geerbten Schnittstellenklasse und dann beim Erstellen eines neuen Objekts dieser Klasse nicht vergessen, diesetAttribute(Qt::WA_DeleteOnClose)
Funktion Ihres Objekts auszuführen .quelle