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?

Author: Vinayak Garg, 2011-12-17

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.

 36
Author: mihaipopescu, 2018-09-05 19:54:18
  1. 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.

  2. 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.

  3. 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).

 0
Author: C Johnson, 2011-12-17 11:31:15
Talvez alguns tipos de instâncias estáticas ainda sejam alocadas pelo framework. Tente resolvê-lo com um profiler como "devpartner".
 0
Author: AlexTheo, 2011-12-17 11:40:42

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).

 0
Author: user1071136, 2011-12-17 11:52:42

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]}

 0
Author: ans, 2011-12-17 13:00:59