sì, è perdita di memoria nel tuo caso, ma si può evitare perdita di memoria nei casi in cui dialogo non modale allocato sul mucchio facendo uso di rilevante PostNcDestroy
.
Le finestre di dialogo non sono progettate per la pulizia automatica (dove come finestre del fotogramma principale, le finestre di visualizzazione sono). Nel caso in cui si desideri fornire la pulizia automatica delle finestre di dialogo, è necessario sostituire la funzione membro PostNcDestroy
nella classe derivata. Per aggiungere la pulizia automatica alla classe, chiamare la classe base e quindi fare una delete this
. Per rimuovere la cancellazione automatica dalla classe, chiamare direttamente CWnd::PostNcDestroy
anziché il membro PostNcDestroy
nella classe di base diretta.
void MyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
Come funziona (da MSDN):
Quando distruggendo una finestra di Windows, l'ultimo messaggio di Windows inviato alla finestra è WM_NCDESTROY. Il gestore predefinito CWnd per quel messaggio (CWnd :: OnNcDestroy) scollega l'HWND dall'oggetto C++ e chiama la funzione virtuale PostNcDestroy. Alcune classi sostituiscono questa funzione con elimina l'oggetto C++.
"elimina questo" libera qualsiasi memoria C++ associata all'oggetto C++. Anche se le chiamate distruttore predefinito CWnd DestroyWindow se m_hWnd è non-NULL, ciò non porta a ricorsione infinita poiché la maniglia viene staccato e NULL durante la fase pulitura.
È anche possibile consultare MSDN (Destroying Window Objects) per ulteriori dettagli.
Nota:
Questo funziona per il dialogo non modale che può essere allocata sul mucchio.
fonte
2009-06-03 11:16:32
Grazie. Ho dimenticato di dire che questo è per una finestra di dialogo Modeless. Presumo che in questo caso per la pulizia l'oggetto di dialogo debba essere una variabile membro, quindi può essere distrutto/de-allocato nel distruttore dei frame. – Richard