Oui, il est fuite de mémoire dans votre cas, mais vous pouvez éviter la fuite de mémoire dans les cas où de dialogue modales attribués sur le tas en faisant usage de passer outre PostNcDestroy
.
Dialogs ne sont pas conçus pour l'auto-nettoyage (où les fenêtres de cadre principal, fenêtres View sont). Si vous souhaitez fournir le nettoyage automatique pour les boîtes de dialogue, vous devez remplacer la fonction membre PostNcDestroy
de votre classe dérivée. Pour ajouter un nettoyage automatique à votre classe, appelez votre classe de base, puis faites un delete this
. Pour supprimer le nettoyage automatique de votre classe, appelez le CWnd::PostNcDestroy
directement au lieu du membre PostNcDestroy
dans votre classe de base directe.
void MyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
Comment cela fonctionne (à partir de MSDN):
Lors de la destruction d'une fenêtre Windows, le dernier message de Windows envoyé à la fenêtre est WM_NCDESTROY. Le gestionnaire CWnd par défaut pour ce message (CWnd :: OnNcDestroy) va détacher le HWND de l'objet C++ et appeler la fonction virtuelle PostNcDestroy. Certaines classes remplacent cette fonction pour supprimer l'objet C++.
« supprimer cette » libérera une mémoire C++ associée à l'objet C de. Même si les appels par défaut CWnd destructor DestroyWindow si m_hWnd est non NULL, cela ne conduit pas à récursion infinie puisque la poignée sera détaché et NULL lors de la phase de nettoyage .
Vous pouvez également vous référer à MSDN (Destroying Window Objects) pour plus de détails.
Note:
Cela fonctionne pour dialogue modales qui peut être alloué sur le tas .
Merci. J'ai oublié de dire que c'est pour une boîte de dialogue Modeless. Je suppose que dans ce cas pour le nettoyage, l'objet de dialogue doit être une variable membre - donc il peut être détruit/désaffecté dans le destructeur d'images. – Richard