Partilhar via


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.

Consulte também

Conceitos

Isolamento e detecção de perda de memória