Partilhar via


A pilha de depurar e gerenciamento 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.

Dois dos problemas mais comuns e intractable programadores encontrar estão substituindo o participante de um vazamentos de buffer e memória alocados (Falha ao liberar alocações depois que eles não são mais necessárias).A depurar heap fornece ferramentas avançadas para solucionar problemas de alocação de memória desse tipo.

Versões do heap funções de depurar

As versões de depuração das funções de heap telefonar as versões padrão ou base usadas em compilações de versão.Quando você solicita um bloco de memória, o Gerenciador de heap de depurar aloca da pilha base um bloco ligeiramente maior de memória que solicitou e retorna um ponteiro para sua parte desse bloco.Por exemplo, suponha que seu aplicativo contém a telefonar: malloc( 10 ).Em uma criação para versão, malloc seria telefonar a rotina de alocação de heap base solicitando uma alocação de 10 bytes. Em uma compilação de depurar, no entanto, malloc chamaria _malloc_dbg, que, em seguida, chamaria a rotina de alocação de heap base solicitando uma alocação de 10 bytes, além de aproximadamente 36 bytes de memória adicional. Blocos de toda a memória resultante na depurar heap são conectados em uma única lista vinculada, ordenada de acordo com a quando foram alocados.

A memória adicional alocada pelas rotinas de heap de depurar é usada para informações de escrituração contábil, para ponteiros que blocos de memória de depurar do link juntos e para os buffers pequenos em ambos os lados do seus dados para capturar substitui da região alocado.

Atualmente, a estrutura de cabeçalho de bloco usada para armazenar informações de escrituração contábil da heap de depurar é declarada sistema autônomo segue no arquivo de cabeçalho DBGINT.H:

typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
    struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
    struct _CrtMemBlockHeader *pBlockHeaderPrev;
    char *szFileName;    // File name
    int nLine;           // Line number
    size_t nDataSize;    // Size of user block
    int nBlockUse;       // Type of block
    long lRequest;       // Allocation number
// Buffer just before (lower than) the user's memory:
    unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;

/* In an actual memory block in the debug heap,
 * this structure is followed by:
 *   unsigned char data[nDataSize];
 *   unsigned char anotherGap[nNoMansLandSize];
 */

The NoMansLand buffers em ambos os lados da área de dados de usuário do bloco são atualmente 4 bytes de dimensionar e são preenchidos com um valor de byte conhecidos usado pelas rotinas de heap de depurar para verificar se os limites do bloco de memória do usuário não tiverem sido substituídos. A pilha de depurar também preenche novos blocos de memória com um valor conhecido.Se você optar por manter blocos liberados na lista vinculada da heap conforme explicado abaixo, esses blocos liberados também são preenchidos com um valor conhecido.Atualmente, sistema autônomo valores de byte real usados são:

  • NoMansLand (0xFD)
    Os buffers "NoMansLand" nos dois lados da memória usada por um aplicativo no momento estão preenchidos com 0xFD.

  • Blocos liberados (0xDD)
    Os blocos liberados mantidos não utilizados no heap de depurar do vinculadas lista quando o _CRTDBG_DELAY_FREE_MEM_DF sinalizar está definido no momento são preenchidos com 0xDD.

  • Novos objetos (0xCD)
    Novos objetos estão preenchidos com 0xCD quando eles são alocados.

Consulte também

Outros recursos

A Heap depurar CRT