DestroyWindow en OnDestroy no funciona

Hola, estoy creando una aplicación basada en diálogos en MFC usando:

BOOL CClockMasterDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

m_ModeTabs.Create(this,WS_CHILD | WS_VISIBLE, 0);
}

si destruyo m_ModeTabs in CClockMasterDlg::OnInitDialog función después de que se crea usando:

m_ModeTabs.DestroyWindow();

No tengo memoria, pero se filtra cuando lo coloco en CClockMasterDlg::OnDestroy() Tengo pérdidas de memoria, incluso si me llaman y regresa true. no creo eso OnDestroy is OnInitDialogEs lo contrario, pero entonces ¿cuál es la función? No hay OnExitDialog.

Fugas de memoria detectadas! Volcar objetos -> {601} bloque de cliente en 0x00AEED48, subtipo c0, 212 bytes de longitud. a CMFCVisualManager objeto en $00AEED48, 212 bytes de longitud Volcado de objeto completo. El programa [5312] ClockMaster.exe: Native ha salido con el código 2 (0x2).

Incluso aunque la ventana se destruya automáticamente, ya que no es un puntero, no debería tener pérdidas de memoria, ¿verdad? Y desde que se colocó

m_ModeTabs.DestroyWindow();

en la OnInitDialog función después de su creación resuelve la fuga de memoria realmente no puede ser otra cosa que cause el problema ¿o sí? La eliminación de la m_ModeTabs.Create(... También resuelve la fuga de memoria, así que estoy bastante seguro de que es m_ModeTabs causándolo.

preguntado el 22 de mayo de 12 a las 14:05

2 Respuestas

Aunque no lo dice, asumo que m_ModeTabs es una ventana secundaria de su CClockMasterDlg. En ese caso, o en casos similares, no tiene que llamar explícitamente a DestroyWindow. Cuando Win32 destruye una ventana, todas sus ventanas secundarias también se destruyen.

Dado que declaró su m_ModeTabs como una variable regular (no un puntero), la memoria que posee será liberada automáticamente por el tiempo de ejecución de C++ durante la destructora de CClockMasterDlg.

contestado el 22 de mayo de 12 a las 15:05

Pero entonces, ¿por qué tengo una pérdida de memoria cuando no estoy destruyendo manualmente la ventana? - David

Averigüe dónde se asigna el objeto CMFCViaualManager. Ponga un punto de interrupción en el constructor de la misma, suponiendo que tenga uno. Comienza desde allí. - José Willcoxson

En realidad, encontré un error que se "corregirá en MFC para la próxima versión principal de Visual Studio".

La fuga de memoria ocurre cuando se usa un CVSListBox en una aplicación mfc de solo diálogo.

Puede encontrar información sobre el error y varias soluciones alternativas aquí:

https://connect.microsoft.com/VisualStudio/feedback/details/646445/cvslistbox-produces-memory-leaks

http://connect.microsoft.com/VisualStudio/feedback/details/565327/memory-leaks-using-c

Y otro informe sobre el error aquí:

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/8870974f-1414-4dd7-b7c3-a1c320c0e91e

Cita del primer enlace:

Hola,

Gracias por el informe. Este problema se solucionó en MFC para la próxima versión principal de Visual Studio.

Pat Brenner Desarrollo de bibliotecas de Visual C++

contestado el 22 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.