Est-ce une fuite de mémoire dans MFC
//CMyDialog inherits from CDialog
void CMyFrame::OnBnClickedCreate()
{
CMyDialog* dlg = new CMyDialog();
dlg->Create( IDD_MYDIALOG, m_thisFrame );
dlg->ShowWindow( SW_SHOW );
}
Je suis sûr que cette fuite. Ce que je suis vraiment se poser est: quelle est la "magie" dans MFC qui ne dialogue de nettoyage lorsque la boîte de dialogue est détruit. Comment serait-il fonctionner si dlg n'était pas un pointeur mais a déclaré sur la pile, - ne pas détruire le destructeur de la fenêtre lors de la dlg est hors de portée.
Vous devez vous connecter pour publier un commentaire.
Oui, c'est la fuite de mémoire dans votre cas, mais vous pouvez éviter la fuite de mémoire dans les cas où la boîte de dialogue non modale alloué sur le tas en faisant usage de l'annulation de la
PostNcDestroy
.Les dialogues ne sont pas conçus pour l'auto-nettoyage ( où comme cadre Principal de windows, la fenêtre de Vue sont).
Dans le cas où vous souhaitez fournir à l'auto-nettoyage pour les dialogues, alors vous devez remplacer la
PostNcDestroy
fonction de membre dans votre classe dérivée. Ajouter l'auto-nettoyage de votre classe, faites appel à votre classe de base et ensuite faire undelete this
. Pour supprimer l'auto-nettoyage de votre classe, appelCWnd::PostNcDestroy
directement au lieu de laPostNcDestroy
membre de votre classe de base directe.Comment cela fonctionne (à partir de MSDN):
Vous pouvez également consulter le site web MSDN (En Détruisant Des Objets De Fenêtre ) pour plus de détails.
Remarque:
Cela fonctionne pour boîte de dialogue non modale qui peuvent être alloués sur la tas.
Oui, c'est une fuite. Et oui, la fenêtre serait détruite si l'objet était pile-alloués. À l'aide de boîtes de dialogue sous forme de pile objets alloué est typique pour les boîtes de dialogue modales - vous appelez une méthode pour afficher une boîte de dialogue de la fenêtre modale et que la méthode renvoie uniquement lorsque la boîte de dialogue est fermée et que l'objet est détruit par la suite.
Si vous avez manuellement appel
Create
sur une boîte de dialogue, vous devez manuellementDestroy
il ainsi.Lors de l'utilisation de
DoModal()
ce n'est pas nécessaire.De MSDN: