C/Visual C - Porque me dice: Detected memory leaks????

 
Vista:

Porque me dice: Detected memory leaks????

Publicado por Nelek (816 intervenciones) el 16/08/2006 14:55:42
Resulta que me he dado cuenta de un mensaje que me da el debugger cuando cierro mi aplicacion y no tengo ni idea de que me esta contando. Aquí pongo parte de lo que me dice:

Warning: destroying an unsaved document.
CWinThread::PumpMessage - Received WM_QUIT.
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {1095} normal block at 0x00328870, 43 bytes long.
Data: < Sich> 01 00 00 00 1E 00 00 00 1E 00 00 00 53 69 63 68
strcore.cpp(118) : {1066} normal block at 0x00328080, 14 bytes long.
Data: < - > 01 00 00 00 01 00 00 00 01 00 00 00 2D 00
strcore.cpp(118) : {1065} normal block at 0x00328028, 14 bytes long.

Es malo? Me tengo que preocupar? No me lo dice siempre, solo cuando cierro el programa y hay un dialogbox en funcionamiento no modal abierto. Supongo que sera su manera de liberar la memoria de los controles que hay dentro del dialog box, es posible?

Alguien me puede aclarar de que va esto?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Porque me dice: Detected memory leaks????

Publicado por fernando.gomez (1603 intervenciones) el 16/08/2006 17:18:03
Si eres de los teóricos puristas de la programación, deberías estar muy preocupado. Si eres más de los pragmáticos, te podría valer ma#$%s.

Un memory leak es eso: una fuga en memoria. Esto quiere decir que algo como:

int main()
{
int* p = new int;
return 0;
}

está sucediendo. En algún lugar se están creando dinámicamente objetos que no están siendo liberados al terminar la aplicación. Claro, no creo que sea algo tan pueril como el caso que puse de ejemplo, sino algo más complejo si estás usando MFC.

Usualmente esto pasa por que cierras una ventana -WM_CLOSE- cuando no se debería cerrar. En estos casos, WM_DESTROY no es lanzado a la ventana y por lo tanto, ésta no se puede destruir, siendo imposible liberar recusos. Y si la ventana tiene un DECLARE_DYNCREATE o DECLARE_DYNAMIC, pues te van a saltar las fugas de memoria.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Porque me dice: Detected memory leaks????

Publicado por Nelek (816 intervenciones) el 16/08/2006 21:51:49
Eso me imaginaba, solo me da el mensaje cuando cierro el programa mientras hay un DialogBox en funcionamiento NO MODAL abierto.

resulta que dichos dialog boxes es la unica manera que he encontrado de seguir adelante ya que con las FormViews que comentaba hace un tiempo no lograba llamarlas como tocaba, si no era desde el MainFrame, y luego me ocasionaba un desmadre para pasar datos al y recogerlos del documento. Al final con los dialogboxes me he apanyado bastante bien. Descontando un minimo de variables privadas en el dialogbox (entre ellas un array, que creo que es lo que me da este problema) el resto lo hago todo, trayendo lo que necesito, guardando lo nuevo y salvando dentro de funciones en modo local, y acabo todas las funciones con return. Pero claro, si cierro el programa estando el dialog box abierto... pues ahi me viene el mensaje.

Mi pregunta es...

Puede llegar a afectar al funcionamiento del programa cuando compile en modo Release? hasta el momento con la debug, recibo el mensaje, pero en el debbuger, ni me lanza assertions, ni ningun otro problema, solo el "log" del debbuger.

la verdad es que me estoy quedando sin tiempo y si no me va a afectar... pues como que le van a dar mucho por... He de entregar el martes y aun he de escribir la parte de la documentacion. El programa lo voy a rehacer de nuevo de todas maneras una vez haya pasado todo el tema del proyecto final de carrera. Lo he ido haciendo según el gusto de mi profesor y tengo muchisimo codigo redundante (casi el triple de codigo de lo que tendria habiendolo hecho a mi manera).

En definitva, como de critico es esto? podria equipararse a los "warnings" ? (ya se que es algo bruto pero...) es decir, que estan ahi y crispan los nervios, pero que al final no afectan salvo en contadas ocasiones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

me deje algo

Publicado por Nelek (816 intervenciones) el 16/08/2006 21:54:24
Al releer tu respuesta me he dado cuenta de lo que dijiste de los DECLARE_DYNCREATE o DECLARE_DYNAMIC todos los derivados de CObject que uso como intermediarios o recipientes de datos los tengo declarados asi... es la unica manera que encontre para lograr lo que queria... supongo que habra otras pero... ahora ya es algo tarde.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:me deje algo

Publicado por chuidiang (73 intervenciones) el 18/08/2006 10:13:47
Hola:

La memoria sin liberar puede o no afectar, dependiendo de la aplicación.

Si el programa se va a ejecutar mucho tiempo seguido y va dejando cada vez más memoria sin liberar, a la larga consumirá toda la memoria disponible, el ordenador irá más lento y al final el programa acabará fallando.

Si el programa corre poco tiempo o no está cada poco reservando y no liberando memoria (es sólo una cosa puntual), no deberías tener problemas.

Por ello, el memory leak sólo debería preocuparte seriamente en el primer caso. De todas formas, por elegancia y "buen hacer", deberías preocuparte de liberar esa memoria aunque no te afecte al buen funcionamiento.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hecho en gran medida

Publicado por Nelek (816 intervenciones) el 18/08/2006 11:43:57
Antes, simplemente abriendo un documento que tengo guardado con un sistema de los gordos para no tener que meter siempre todos los datos, abriendo la pantalla de configuracion del regulador y cerrando el programa sin más... Recibía leaks suficientes como para (copiando y pegando al word desde el debbuger) llenar casi 5 paginas.

He cambiado los arrays a la forma del MFC (CArray <CCCData, CCCData&> p_aCCData) en lugar de la estandard de C (p_aCCData [MAXIN])

y luego anyadido esto

void CRegWinDlg::OnDestroy()
{
CDialog::OnDestroy();

// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen
p_aCCData.RemoveAll ();
p_aAttColor.RemoveAll ();
p_aMatrixLabels.RemoveAll ();
}

ahora hago lo mismo y recibo solo (copiando y pegando otra vez al word) 15 lineas, que supongo que seran los objetos que se van abriendo y cerrando en las funciones localmente, segun en la funcion que se encuentre en ese momento.

No se como hacer para solucionar estos ultimos que aun me quedan, pero al menos es una razon casi 10 veces menor que antes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar