103 votes

Gestion de la mémoire en 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 maclasse est détruit? Qu'advient-il si je n'ai pas de supprimer et/ou de détruire mes objets à tous; 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?

105voto

Debilski Points 28586

Si vous construisez votre propre hiérarchie QObjects, qui est, vous permet d'initialiser tous les nouveaux QObjects avec un parent,

QObject* parent = new QObject();
QObject* child = new QObject(parent);

il suffit ensuite de delete le parent, parce que l' parents destructeur prendra soin de détruire child. (Il le fait par l'émission de signaux, de sorte qu'il est en sécurité, même lorsque vous supprimez child 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 n'est question ici de la documentation au sujet de l'objet des arbres.

Si votre MyClass n'est pas un enfant de QObject, vous aurez à utiliser du C++ façon de faire les choses.

Notez également que la hiérarchie parent–enfant de l' QObjects est généralement indépendante de la hiérarchie de la classe C++ hiérarchie/arbre d'héritage. Cela signifie que, qui est affecté un enfant n'a pas besoin d'être une sous-classe de celle du parent. Tout (sous-classe) QObject suffit.

Il pourrait y avoir certaines contraintes imposées par les constructeurs pour d'autres raisons, cependant, comme en QWidget(QWidget* parent=0), où le parent doit être un autre QWidget, 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é à avoir tout QObject en tant que parent.

50voto

Austin Points 386

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:

QVBoxLayout* layout = new QVBoxLayout;
QPushButton someButton = new QPushButton; // No owner specified.
layout->addWidget(someButton); // someButton still has no owner.
QWidget* widget = new QWidget;
widget->setLayout(layout); // someButton is "re-parented".
                           // widget now owns someButton.

Un autre exemple:

QMainWindow* window = new QMainWindow;
QWidget* widget = new QWidget; //widget has no owner
window->setCentralWidget(widget); //widget is now owned by window.

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.

7voto

yesraaj Points 12759

Parent(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

QObject* parent = new QObject();
QObject* child = new QObject(parent);
delete parent;//all the child objects will get deleted when parent is deleted, child object which are deleted before the parent object is removed from the parent's child list so those destructor will not get called once again.

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/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X