2010-02-24 8 views

Respuesta

1

No es una solución directa, pero en general he encontrado que vale la pena mover tanta asignación como sea posible del tiempo de inicialización estático. En general, genera dolores de cabeza (orden de inicialización, orden de inicialización, etc.).

Si esto resulta demasiado difícil puede llamar _CrtMemCheckpoint (http://msdn.microsoft.com/en-us/library/h3z85t43%28VS.80%29.aspx) al inicio de main() y _CrtMemDumpAllObjectsSince al final.

0

¿Puede tomar una instantánea de los objetos actualmente asignados cada vez que quiere una lista? De ser así, podría eliminar los objetos inicialmente asignados de la lista cuando busque fugas que se produzcan durante la operación. En el pasado, he usado esto para encontrar pérdidas incrementales.

Otra solución podría ser ordenar las filtraciones y solo considerar duplicados para la misma línea de código. Esto debería descartar fugas de variables estáticas.

Jacob

1

1) Usted dijo:

Parece cada vez que hay objetos estáticos, _CrtDumpMemoryLeaks devuelve una memoria reclamando positivo que tiene una fuga falsa.

No creo que esto sea correcto. EDITAR: Los objetos estáticos no se crean en el montón. FIN EDITAR: _CrtDumpMemoryLeaks solo cubre la memoria de pila crt. Por lo tanto, se supone que estos objetos no devuelven falsos positivos. Sin embargo, otra cosa es que las variables estáticas sean objetos que contienen algo de memoria de montón (si, por ejemplo, crean dinámicamente objetos miembros con operator new()).

2) Considere usar _CRTDBG_LEAK_CHECK_DF para activar la comprobación de fuga de memoria al final de la ejecución del programa (esto se describe aquí: http://msdn.microsoft.com/en-us/library/d41t22sb(VS.80).aspx). Supongo que la verificación de fuga de memoria se realiza incluso después de la terminación de las variables estáticas.

+0

Los objetos estáticos no están asignados en la pila. –

+0

@Billy: gracias por su corrección ... supongamos que tiene razón. Sin embargo, tampoco están asignados en el montón, ¿verdad? –

+0

Espero que ustedes ya hayan descubierto dónde se almacenan los objetos estáticos. – Krum

0

Ach. Si está seguro de que _CrtDumpMemoryLeaks() está mintiendo, entonces probablemente esté en lo cierto. La mayoría de las supuestas filtraciones de memoria que veo se deben a llamadas incorect a _CrtDumpMemoryLeaks(). Estoy totalmente de acuerdo con lo siguiente; _CrtDumpMemoryLeaks() vuelca todos los mangos abiertos. Pero probablemente su programa ya tenga identificadores abiertos, por lo tanto, asegúrese de llamar al _CrtDumpMemoryLeaks() solo cuando se hayan liberado todos los identificadores. Vea http://www.scottleckie.com/2010/08/_crtdumpmemoryleaks-and-related-fun/ para más información.

+0

El enlace está muerto. Además, '_CrtDumpMemoryLeaks' no supervisa los identificadores. Se refiere estrictamente a los bloques de memoria en el montón de depuración. – IInspectable

10

Descubrí que si le indica que verifique la memoria automáticamente después de que finaliza el programa, permite que se tomen en cuenta todos los objetos estáticos. Estaba usando log4cxx y boost que hacen muchas asignaciones en bloques estáticos, esto solucionó mis "falsos positivos" ...

Añadir la siguiente línea, en lugar de invocar _CrtDumpMemoryLeaks, en algún lugar en el comienzo de main():

_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 

Para más detalles sobre el uso y las macros, consulte el artículo de MSDN:

http://msdn.microsoft.com/en-us/library/5at7yxcs(v=vs.71).aspx

+0

Todavía obtengo una pérdida de memoria en este código de refuerzo 'BOOST_LOG_TRIVIAL (error) <<" Módulo: ";' configuración _CrtSetDbgFlag no me ayudó. ¿Tienes alguna idea? –

Cuestiones relacionadas