Parece que siempre que hay objetos estáticos, _CrtDumpMemoryLeaks devuelve un falso positivo alegando que está perdiendo memoria. Sé que esto se debe a que no se destruyen hasta después de la función main() (o WinMain). ¿Pero hay alguna forma de evitar esto? Yo uso VS2008.¿Cómo ignorar las falsas pérdidas de memoria positivas de _CrtDumpMemoryLeaks?
Respuesta
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.
¿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) 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.
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.
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
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
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? –
- 1. ¿Cuán probable es md5 sumas positivas falsas?
- 2. Cómo usar _CrtDumpMemoryLeaks()
- 3. Las pérdidas de memoria en Firefox addons
- 4. ¿Evita las pérdidas de memoria en las devoluciones de llamada?
- 5. ¿Cómo se resuelven las pérdidas de memoria del oyente oscilante?
- 6. ¿Cómo identificar las pérdidas de memoria en Android?
- 7. pérdidas de memoria en Microsoft.FSharp.Control.Mailbox?
- 8. SBJson - ¿Tiene pérdidas de memoria?
- 9. C#: simular pérdidas de memoria
- 10. Javascript a pérdidas de memoria
- 11. SoundPlayer provocando pérdidas de memoria?
- 12. Factores principales para las pérdidas de memoria en Rails
- 13. ¿Manipulación de cadenas sin pérdidas de memoria?
- 14. Controlador de eventos y pérdidas de memoria
- 15. ¿Utilizará goto para causar pérdidas de memoria?
- 16. Android Surfaceview Hilos y pérdidas de memoria
- 17. Evitar pérdidas de memoria Scala - Scala constructores
- 18. javascript, referencias circulares y pérdidas de memoria
- 19. ¿Cómo puedo encontrar pérdidas de memoria en mi programa Python?
- 20. ¿Cómo puedo evitar causar pérdidas de memoria en Firefox?
- 21. ¿Cuáles son las formas de resolver las pérdidas de memoria en C#
- 22. ¿Las condiciones deberían ser positivas o negativas?
- 23. Cómo eliminar elementos DOM sin pérdidas de memoria?
- 24. ¿Cómo resuelvo las pérdidas de memoria que se informa que residen en la cadena STL?
- 25. Depuración de pérdidas de memoria con el servidor Node.js
- 26. ¿Por qué el uso de "nuevo" causa pérdidas de memoria?
- 27. ¿Hay alguna forma de evitar las pérdidas de memoria por falta de implementación en Tomcat?
- 28. Herramientas para pérdidas de memoria en .Net ejecutable
- 29. Qt: ¿"nuevo sin eliminar" causa pérdidas de memoria con controles?
- 30. ¿Sabes lo que puede causar pérdidas de memoria en JavaScript?
Los objetos estáticos no están asignados en la pila. –
@Billy: gracias por su corrección ... supongamos que tiene razón. Sin embargo, tampoco están asignados en el montón, ¿verdad? –
Espero que ustedes ya hayan descubierto dónde se almacenan los objetos estáticos. – Krum