Habilitação de detecção de perda de memória
Este tópico se aplica a:
Edição |
Visual Basic |
C# |
C++ |
Desenvolvedores Web |
---|---|---|---|---|
Express |
Somente nativo |
|||
Padrão |
Somente nativo |
|||
PRO e equipe |
Somente nativo |
Legenda de tabela:
Aplica-se |
|
Não é aplicada |
|
Comando ou comandos oculta por padrão. |
As principais ferramentas para detecção de vazamentos são o depurador e o C em tempo de execução bibliotecas (CRT) de memória heap funções de depurar.Para habilitar as funções de heap de depurar, inclua as instruções a seguir no seu programa:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
Observação: |
---|
O #include instruções devem ser na ordem mostrada aqui. Se você alterar a ordem, funções que você usar podem não funcionar corretamente. |
Incluindo crtdbg.h, mapear o malloc and disponível funções para suas versões de depurar, _malloc_dbg and _free_dbg, que manter o controle de alocação de memória e desalocação.Este mapeamento ocorre apenas em uma compilação de depurar (no qual _DEBUG é definido). Compilações lançadas usam o comum malloc e free funções.
The #define demonstrativo mapeia as versões base das funções CRT heap para as versões de depurar correspondente. Você não precisa absolutamente nesta demonstrativo, mas sem ele, o despejo de perda de memória conterá informações menos útil.
Quando você tiver adicionado as instruções anteriores, será possível despejo informações de perda de memória, incluindo a demonstrativo a seguir no seu programa:
_CrtDumpMemoryLeaks();
Quando você executa o programa no depurador, _CrtDumpMemoryLeaks exibe informações sobre perda de memória no Janela de saída.As informações de perda de memória tem esta aparência:
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Se você não usar o #define _CRTDBG_MAPALLOC demonstrativo, o despejo de perda de memória teria esta aparência:
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Sem _CRTDBG_MAP_ALLOC a exibição definido, mostra:
O número de alocação de memória (entre chaves).
The tipo de bloco, que é normal, cliente ou CRT.
O local da memória em hexadecimal formulário.
O dimensionar de bloco em bytes.
O Sumário dos primeiros 16 bytes, também em formato hexadecimal.
Com _CRTDBG_MAP_ALLOC definido, a tela também mostra o arquivo em que foi alocada a memória perdida. O número entre parênteses após nome de arquivo (nesse exemplo, 20) é número de linha no arquivo.
Para ir para linha no arquivo de fonte onde a memória é alocada
clicar duas vezes na linha no Saída janela que contém o arquivo de nome e o número de linha.
- ou -
selecionar a linha no Saída janela que contém o nome de arquivo e número de linha e pressione F4.
_CrtSetDbgFlag
De chamada_CrtDumpMemoryLeaks é muito fácil se seu programa é encerrado sempre no mesmo lugar.Se seu programa pode sair de vários locais, em vez de colocar uma telefonar para _CrtDumpMemoryLeaks em cada possível sair, você pode incluir a seguinte telefonar no início do programa:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
Essa demonstrativo chama automaticamente _CrtDumpMemoryLeaks Quando o programa será encerrado. Você deve conjunto ambos sistema autônomo campos de bit, _CRTDBG_ALLOC_MEM_DF e _CRTDBG_LEAK_CHECK_DF, conforme mostrado anteriormente.
Definindo o modo de relatório de CRT
Por padrão, _CrtDumpMemoryLeaks Despeja informações de perda de memória para o Depurar painel do Saída janela, conforme descrito anteriormente.Você pode reiniciar esta opção para despejar para outro local usando _CrtSetReportMode. Se você usar uma biblioteca, ele pode reiniciar a saída para outro local.Nesse caso, você pode conjunto o local de saída volta para o Saídajanela de usando a demonstrativo a seguir:
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
Para obter mais informações, consulte _CrtSetReportMode.