Je suis assez nouveau sur Qt et je me pose des questions sur certains éléments de base avec la gestion de la mémoire et la vie des objets. Quand dois-je supprimer et / ou détruire mes objets? Est-ce que tout cela est géré automatiquement?
Dans l'exemple ci-dessous, lequel des objets que je crée dois-je supprimer? Qu'arrive-t-il à la variable d'instance myOtherClass
lorsqu'elle myClass
est détruite? Que se passe-t-il si je ne supprime pas (ou ne détruit) pas du tout mes objets? Est-ce que ce sera un problème de mémoire?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MaClasse.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Comme vous pouvez le voir, c'est assez facile pour les débutants, mais où puis-je en apprendre davantage à ce sujet de manière simple?
(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 sûr. Dans Qt 4.7.4, les enfants QObject sont supprimés directement (viadelete
, voir qobject.cpp, ligne 1955). La raison pour laquelle il est sûr de supprimer d'abord les objets enfants est qu'un QObject dit à son parent de l'oublier lorsqu'il est supprimé.ClassB
hérite deQObject
etClassC
hérite deClassB
, alorsClassC
ne sera correctement détruit par la relation parent-enfant de Qt que siClassB
le destructeur de est virtuel.Je voudrais prolonger la réponse de Debilski en soulignant que le concept de propriété est très important dans Qt. Lorsque la classe A assume la propriété de la classe B, la classe B est supprimée lorsque la classe A est supprimée. Il existe plusieurs situations dans lesquelles un objet devient propriétaire d'un autre, pas seulement lorsque vous créez un objet et spécifiez son parent.
Par exemple:
Un autre exemple:
Alors, vérifiez souvent la documentation, elle spécifie généralement si une méthode affectera la propriété d'un objet.
Comme indiqué par Debilski, ces règles s'appliquent UNIQUEMENT aux objets qui dérivent de QObject. Si votre classe ne dérive pas de QObject, vous devrez gérer la destruction vous-même.
la source
Parent (soit l'objet QObject ou sa classe dérivée) a une liste de pointeurs vers ses enfants (QObject / son dérivé). Le parent supprimera tous les objets de sa liste d'enfants pendant que le parent est détruit. Vous pouvez utiliser cette propriété de QObject pour que les objets enfants soient supprimés automatiquement chaque fois que le parent est supprimé. La relation peut être établie à l'aide du code suivant
Il existe un autre moyen de gérer la mémoire dans Qt, en utilisant smartpointer. L'article suivant décrit divers pointeurs intelligents dans Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
la source
Pour ajouter à ces réponses, à des fins de vérification, je vous recommande d'utiliser la
Visual Leak Detetor
bibliothèque pour vos projets Visual C ++, y compris les projets Qt car elle est basée sur C ++, cette bibliothèque est compatible avec lesnew, delete, free and malloc
déclarations, elle est bien documentée et facile à utiliser. N'oubliez pas que lorsque vous créez votre propre classe d'interfaceQDialog
ouQWidget
héritée, puis créez un nouvel objet de cette classe, n'oubliez pas d'exécuter lasetAttribute(Qt::WA_DeleteOnClose)
fonction de votre objet.la source