C/Visual C - Como saber si quedan objetos por liberar??

 
Vista:

Como saber si quedan objetos por liberar??

Publicado por Nelek (816 intervenciones) el 22/02/2007 11:24:55
Hola,

Al final tengo que retomar la version antigua de mi proyecto donde, en lugar de trabajar con punteros a los objetos donde guardo los datos relevantes, trabajo con los objetos en si. Es decir, devuelvo el objeto en si al utiliar la funcion de busqueda de un determinado objeto, en vez de una referencia al objeto. Por lo que se pueden quedar en memoria si no llamo al destructor al acabar de trabajar con el.

La cosa esta en que no puedo usar el destructor siempre que llamo a un objeto porque me salen mensajes de fallos y assertions. Supongo que es porque hay veces que el propio programa llama al destructor internamente (sin yo verlo directamente o saber en que posicion es llamado).

Hace un tiempo tuve problemas con memory leaks y lo resolvi en gran medida, no me quite todos los avisos pero los reduje del orden de 20 veces usando los destructores de listas y vectores. Pero los objetos locales... creo que aun se quedan por ahi.

Por eso me gustaria saber si hay alguna manera de controlar si se quedan objetos en memoria cuando cierro ventanas o la aplicacion entera, para poder usar el destructor en el paso inmediato interior y asi liberar la memoria.
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

Ejemplo concreto

Publicado por Nelek (816 intervenciones) el 22/02/2007 11:44:23
Aqui pongo lo que quiero decir arriba:

int CFPSView::CheckInHit(CPoint point)
{
// Connecting to the FPSDoc to get datas from it or to send datas to it
CFPSDoc* pDoc = GetDocument ();
ASSERT_VALID (pDoc);

POSITION posI = pDoc->GetInHeadPosition ();
while (posI != NULL)
{
//Me traigo el objeto completo para comprobar sus coordenadas
CInputData idTempInput = pDoc->GetInNext (posI);
cpInCoord = idTempInput.GetInCoord ();
posI = pDoc->GetInPosition ();

//Compruebo si el click esta dentro del espacio ocupado por la senyal
//Y si es asi aumento el nHits para luego saber a cuantas le he dado (solapados)

idTempInput.~CInputData (); <<<<<----- AQUI ES EL PUNTO CONFLICTIVO
}
Invalidate ();
UpdateWindow ();
return nIHits;
}

Si uso el destructor del objeto recibo una ASSERTION: "Excepcion no contemplada en el FPS.exe (MSVCRTD.DLL): 0xC0000005: Violacion de acceso"

que me manda al ensamblador o.O:
LeadDown2:
10219BD8 mov al,byte ptr [esi+3]
10219BDB and edx,ecx

La gran mayoria de funciones trabajan asi, creo un objeto temporal donde le meto el retorno de la funcion que busca el objeto concreto dentro de la lista del documento. Por lo que si no uso los destructores... creo que estare dejando "porqueria" en la memoria que mejor seria no tenerla. Supongo que de vez en cuando el VC++ se encargara de destruir los objetos que sean locales dentro de las funciones, pero me gustaria saber si a pesar de todo se queda "basura" por ahi o no.

Existe algun modo de hacerlo? Gracias
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:Ejemplo concreto

Publicado por fernando.gomez (1603 intervenciones) el 22/02/2007 23:05:13
Er... tú no puedes mandar llamar un destructor. Si el objeto lo creaste dinámicamente (usando "new"), entonces tienes que "destruirlo" empleando delete. Si solamente instancias el objeto como en tu ejemplo, no puedes eliminarlo - se elimina solo cuando se termine el alcance de la variable (i.e. la función) o el programa.

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