Quiero encontrar pérdidas de memoria en mi aplicación utilizando utilidades estándar. Anteriormente utilicé mi propio asignador de memoria, pero otras personas (sí, usted AlienFluid) sugirieron usar el verificador de aplicaciones de Microsoft, pero parece que no puedo informar de mis filtraciones. Tengo el siguiente aplicación sencilla:Cómo usar Application Verifier para encontrar fugas de memoria
#include <iostream>
#include <conio.h>
class X
{
public:
X::X() : m_value(123) {}
private:
int m_value;
};
void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;
p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}
Esta prueba claramente contiene una pérdida de memoria: P2 es new'd pero no eliminado.
construyo el ejecutable usando las siguientes líneas de comandos:
cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj
He descargado comprobador de aplicaciones (4.0.0665) y habilitar todos los controles.
Si ahora ejecuto mi aplicación de prueba, puedo ver un registro de ello en Application Verifier, pero no veo la pérdida de memoria.
Preguntas:
- ¿Por qué no informan comprobador de aplicaciones de una fuga?
- ¿O no es Application Verifier realmente destinado a encontrar fugas?
- Si no están disponibles otras herramientas para informar claramente las fugas al final de la aplicación (es decir, no tomando instantáneas regulares y comparándolas, ya que esto no es posible en una aplicación que toma 1GB o más), incluida la llamada pila del lugar de asignación (por lo que no es el simple informe de fugas al final de la CRT)
Si no encuentro una utilidad decente, todavía tengo que confiar en mi propio administrador de memoria (que lo hace perfectamente).
Este es el problema con estas herramientas: hacen todo menos lo que realmente necesitamos ... ¿La detección de filtraciones de memoria CRT está bien para usted, incluido el lugar de asignación en el código, pero sin la pila de llamadas? En este caso, solo necesita redefinir el nuevo operador y activar el volcado de pérdidas de memoria. –
El problema es que tengo un asignador de memoria perfectamente autodirigido que funciona bastante rápido, registra todas las asignaciones de memoria, incluidas las pilas de llamadas, las filtraciones de informes (incluida la pila de llamadas) al final de la aplicación, comprueba si hay desbordamientos/subdesbordamientos de búfer. .., PERO todos (en StackOverflow) parecen indicar que NO DEBES escribir tu propio administrador de memoria ya que el estándar de CRT/Windows es lo suficientemente bueno, y hay suficientes utilidades para encontrar pérdidas de memoria, sobrescrituras, ... Sin embargo, parece que no puedo hacer que funcionen. – Patrick
También creo que la detección de fugas de memoria no es una razón para escribir su propio asignador de memoria. CRT ofrece todo, excepto el seguimiento de la pila: si es interesante, puedo publicar el código. –