Fugas de memória detectadas
na minha aplicação wxWidgets, enquanto corria no modo de depuração recebi esta mensagem no resultado do Visual Studio 2010. A candidatura correu bem, e só vi isto depois de a fechar.
Detectaram fugas de memória!objectos de Dumping - >
{9554} bloco normal a 0x003CDCC0, 44 bytes de comprimento.
Dados: < e n d > 20 C1 65 01 00 00 00 6E 00 00 9C CE 64 01{9553} bloco normal a 0x003CDB58, 8 bytes de comprimento.
Dados: < D e < > 44 BD 65 01 C0 DC 3C 00
{9552} bloco normal a 0x003CDC50, 48 bytes de comprimento.Dados: < e > A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00
despejo de objectos completo.
no meu programa não estou a atribuir explicitamente a memória, no entanto, o framework wxWidgets é. Recebi esta mensagem pela primeira vez e não sei a causa exacta.
Como posso livrar-me desta fuga de memória?5 answers
Basta adicionar as seguintes linhas no início da sua função principal. Adicionando esta bandeira, o Visual Studio vai quebrar na linha que está criando a fuga de memória.
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc(9554);
_CrtSetBreakAlloc(9553);
_CrtSetBreakAlloc(9552);
Certifique-se de que tem o endereço normal de bloco do objecto correcto porque eles podem mudar e certifique-se de que está a compilar na _DEBUG.
Ver também: _critsetdbgflage _critsetbreakalloc.
Nunca suponha que o seu código é à prova de fuga de memória. A não ser que sejas um dos deuses da programação, ninguém é imune a fugas de memória.
Você poderia usar uma ferramenta como bounds checker (a partir de Microfocus) para ajudar a identificar o vazamento de memória, porque ele lhe dará um callstack. O relatório de fuga de memória que obtiveste do CRT de depuração diz-te que a memória vazou num endereço em particular. Um produto como o bounds checker dar-lhe-á um callstack para aquela fuga de memória, juntamente com muitas outras coisas. Há outras ferramentas de fuga de memória no mercado, mas não vou tentar listá-las aqui.
Se você tem certeza de que o vazamento de memória é devido a 'wxWidgets', então talvez você deve informar os escritores dessa biblioteca e talvez eles vão corrigi-lo (com passos repro adequados).
Este wiki sugere a adição do seguinte a cada ficheiro de código que tenha, depois de todos os outros cabeçalhos incluírem:
#ifdef __WXMSW__
#include <wx/msw/msvcrt.h> // redefines the new() operator
#endif
Isto resultará em fugas a serem reportadas quando o programa terminar.
Mais especificamente, certifique-se que liga ->Destroy()
para todos os objectos que criar usando {[[2]} (excepto talvez a sua janela superior).
Se a localização da fuga comunicada pelo vs for sempre a mesma, poderá definir um ponto de base de dados para ver quando esta memória está a ser alterada e, com sorte, descobrir quem está a atribuir esta memória {[[2]}