Gestion de la mémoire dans Qt?
Je suis assez nouveau pour Qt et je me demande sur certains trucs de base avec la gestion de la mémoire et de la vie des objets. Quand dois-je besoin de supprimer et/ou de détruire mes objets? Tout cela est-il géré automatiquement?
Dans l'exemple ci-dessous, laquelle de ces objets, j'ai créer dois-je supprimer? Ce qui se passe à la variable d'instance myOtherClass
quand myClass
est détruit? Qu'advient-il si je n'ai pas de supprimer (ou détruire) mes objets? Est-ce un problème de mémoire?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Comme vous pouvez le voir c'est tout à fait débutant-facile des trucs, mais où puis-je apprendre à ce sujet dans une manière facile?
Vous devez vous connecter pour publier un commentaire.
Si vous construisez votre propre hiérarchie avec
QObject
s, qui est, vous permet d'initialiser tous les nouveauxQObject
s avec un parent,il suffit ensuite de
delete
laparent
, parce que leparent
s destructeur prendra soin de détruirechild
. (Il le fait par l'émission de signaux, de sorte qu'il est en sécurité, même lorsque vous supprimezchild
manuellement avant que le parent.)Vous pouvez également supprimer le premier enfant, l'ordre n'a pas d'importance. Pour un exemple où l'ordre ne question ici de la documentation au sujet de l'objet des arbres.
Si votre
MyClass
n'est pas un enfant deQObject
, vous aurez à utiliser du C++ façon de faire les choses.Notez également que la hiérarchie parent–enfant de
QObject
s est généralement indépendante de la hiérarchie de la classe C++ hiérarchie/arbre d'héritage. Cela signifie, que attribuée à l'enfant n'a pas besoin d'être une sous-classe de celle du parent. Tout (sous-classe)QObject
suffira.Il pourrait y avoir certaines contraintes imposées par les constructeurs pour d'autres raisons, cependant, comme dans
QWidget(QWidget* parent=0)
, où le parent doit être un autreQWidget
, grâce, par exemple, la visibilité drapeaux et parce que vous souhaitez faire quelques notions de mise en page de cette façon; mais pour Qt hiérarchie du système en général, vous êtes autorisés àQObject
en tant que parent.(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> Ce n'est pas la raison pour laquelle il est en sécurité. Dans Qt 4.7.4, QObject enfants supprimés directement (viadelete
, voir qobject.cpp de ligne, 1955). La raison pour laquelle il est préférable de supprimer les objets enfants d'abord est qu'un QObject dit son parent à l'oublier quand il est supprimé.ClassB
hérite deQObject
etClassC
hérite deClassB
, puisClassC
ne s'y détruit par Qt de la relation parent-enfant siClassB
's destructeur est virtuel.Je voudrais étendre Debilski réponse en soulignant que le concept de propriété est très importante dans Qt. Quand la classe suppose Une propriété de la classe B, classe B est supprimé lorsque la classe A est supprimé. Il existe plusieurs situations où un objet devient le propriétaire de l'autre, et pas seulement lorsque vous créez un objet et de préciser sa mère.
Par exemple:
Un autre exemple:
Donc, vérifiez la documentation souvent, il est généralement précise si une méthode d'incidence sur la propriété d'un objet.
Comme l'a déclaré Debilski, ces règles ne s'appliquent qu'à des objets qui proviennent de QObject. Si votre classe ne découle pas de QObject, vous devrez gérer la destruction de soi-même.
Parent(soit de QObject, objet ou sa classe dérivée) a une liste de pointeur à ses enfants(QObject/ses dérivés). Le parent va supprimer tous les objets dans sa liste d'enfants tandis que le parent est détruit.
Vous pouvez utiliser cette propriété de QObject pour enfants, objets de supprimer automatiquement lorsque le parent est supprimé.
La relation peut être établie en utilisant le code suivant
Il y a d'autres façon de gérer la mémoire dans Qt, à l'aide de smartpointer. L'article suivant décrit les différents pointeurs intelligents dans Qt.
https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
À ajouter sur ces réponses, pour vérification, je vous recommande d'utiliser
Visual Leak Detetor
bibliothèque pour votre Visual c++ projets, y compris Qt projets depuis son basé sur le c++, cette bibliothèque est compatible avecnew, delete, free and malloc
états, il est bien documenté et facile à utiliser. N'oubliez pas que lorsque vous créez votre propreQDialog
ouQWidget
interface héritée de la classe, et puis créer un nouvel objet de cette classe, n'oubliez pas d'exécutersetAttribute(Qt::WA_DeleteOnClose)
fonction de votre objet.