2009-03-22 4 views
1

Je suis en train de créer un programme en Qt, OpenCv, Mac OS X. J'ai une fenêtre principale, puis une fenêtre séparée qui est ouverte. Je passe la nouvelle fenêtre plusieurs clones de la matrice dans le constructeur:Comment libérer la mémoire lors de la fermeture d'une fenêtre Qt?

ImageWindow *imageWin = new ImageWindow( 
    cvCloneMat(getData->getMasterRawMat(1)), 
    cvCloneMat(getData->getMasterRawMat(2)), 
    cvCloneMat(getData->getMasterRawMat(3)), 
    cvCloneMat(getData->getMasterRawMat(4))); 
imageWin->show(); 

Comment puis-je DEALLOCATE (où dois-je appeler cvReleaseMat), lorsque la nouvelle fenêtre est fermée?

Répondre

8

Vous pouvez le faire par ex. votre closeEvent(). Sinon, si vous utilisez Qt::WA_DeleteOnClose pour votre widget attributes, le widget sera supprimé lorsqu'il est fermé, ce qui signifie que vous pouvez placer des routines de nettoyage dans le destructeur.

+0

commentaire: Assurez-vous de bien associer votre 'ImageWindow * imageWin'. Le rôle parental adéquat dans QT pour la gestion de la mémoire :) – bgs

+0

L'ajout de l'indicateur 'Qt :: WA_DeleteOnClose' à' QWidget' suffira-t-il lorsque l'utilisateur le ferme en appuyant sur le bouton de fermeture, sa mémoire associée est désallouée? Je l'initialise comme dire 'QTableWidget * w = new QTableWidget();' – SexyBeast

1

Envisagez d'utiliser RAII idiom et smart pointers et vous n'avez pas besoin de vous rappeler quand libérer la mémoire allouée.

+0

Fermeture de la fenêtre est! = Suppression de la fenêtre. Pointeur intelligent n'aident pas ici. – ypnos

+0

Dans le cas actuel, si les données sont libérées dans closeEvent() et la fenêtre est réutilisée plus tard, il y aura UB lorsque vous essayez d'accéder aux matrices clonées, car elles sont allouées dans le constructeur de la fenêtre. Les éléments alloués dans le constructeur doivent être supprimés dans destructor dans 99% des cas, y compris celui-ci. – Paul

+0

Tout ce que je voulais dire, c'est que la question était de savoir comment déclencher la destruction à la fermeture d'une fenêtre. Il ne s'agissait pas de savoir comment rendre la destruction plus facile ou plus intelligente ou quoi que ce soit. – ypnos

Questions connexes