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.