sí, es pérdida de memoria en su caso, pero se puede evitar la pérdida de memoria en los casos en que no modal de diálogo asigna en el montón, haciendo uso de anular PostNcDestroy
.
Los cuadros de diálogo no están diseñados para la auto-limpieza (donde, como ventanas de marco principal, ventanas de vista). En caso de que desee proporcionar la limpieza automática para los cuadros de diálogo, debe anular la función de miembro PostNcDestroy
en su clase derivada. Para agregar la auto-limpieza a su clase, llame a su clase base y luego haga un delete this
. Para eliminar la auto-limpieza de su clase, llame directamente al CWnd::PostNcDestroy
en lugar del miembro PostNcDestroy
en su clase base directa.
void MyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
¿Cómo funciona esto (de MSDN):
Cuando la destrucción de una ventana de Windows, el último mensaje enviado de Windows a la ventana es WM_NCDESTROY. El controlador predeterminado CWnd para ese mensaje (CWnd :: OnNcDestroy) se desconectará el HWND del objeto C++ y llama a la función virtual PostNcDestroy. Algunas clases anulan esta función a eliminan el objeto C++.
"eliminar esto" liberará cualquier C++ memoria asociada con el objeto C++. A pesar de que los predeterminado CWnd llamadas destructor DestroyWindow si m_hWnd no es NULL, esto no conduce a recursividad infinita ya que el mango será separada y NULL durante la fase de limpieza.
También puede consultar MSDN (Destroying Window Objects) para obtener más información.
Nota:
Esto funciona para diálogo no modal que puede ser asignada en el montón .
Gracias. Olvidé decir que esto es para un diálogo sin modo. Supongo que en este caso para la limpieza, el objeto de diálogo tiene que ser una variable miembro, por lo que se puede destruir/desasignar en el destructor de marcos. – Richard