Partilhar via


Interpretação de despejo do objeto

This topic applies to:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Native only

O tópico não é aplicável

Pro, Premium e Ultimate

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Native only

O tópico não é aplicável

Observe este despejo do objeto mais detalhadamente:

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

O programa que gerou esse despejo tinha apenas duas alocações explícitas — um na pilha e uma na pilha:

// Do your memory allocations and deallocations.
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );

O CPerson construtor utiliza três argumentos que são ponteiros para char, que são usados para inicializar CString variáveis de membro. O despejo de memória, você pode ver o CPerson objeto junto com três blocos de Let (3, 4 e 5). Mantêm os caracteres para o CString variáveis de membro e não será excluído quando o CPerson objeto destruidor é invocado.

O número de bloco 2 é o CPerson próprio objeto. $51A4representa o endereço do bloco e é seguido pelo conteúdo do objeto, que eram de saída por CPerson:Dump Quando chamado por DumpAllObjectsSince.

Você pode imaginar a número 1 do bloco está associado a CString variável de quadro por causa de seu número de seqüência e o tamanho, que corresponde ao número de caracteres no quadro CString variável. Alocada no quadro de variáveis são automaticamente desalocadas quadro sai do escopo.

Variáveis de quadro

Em geral, você não deve preocupar associados às variáveis do quadro porque eles são automaticamente desalocados as variáveis de quadro Ir fora do escopo de objetos de heap. Para evitar a confusão na suas despejos de diagnóstico de memória, você deve posicionar suas chamadas para Checkpoint para que eles fiquem fora do escopo de variáveis de quadro. Por exemplo, coloque o código anterior de alocação, colchetes de escopo, conforme mostrado aqui:

oldMemState.Checkpoint();
{
    // Do your memory allocations and deallocations ...
    CString s("This is a frame variable");
    // The next object is a heap object.
    CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
}
newMemState.Checkpoint();

Com os suportes de escopo no lugar, o despejo de memória para esse exemplo é:

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

Let alocações

Observe que algumas alocações de objetos (como CPerson) e alguns são Let alocações. " Alocações de Let" são as alocações de objetos não é derivado de CObject ou tipos de alocações de c primitivo, como char, int, ou longo. Se a CObject -classe derivada aloca espaço adicional, como, por exemplo, para buffers internos, esses objetos mostrará as alocações de objeto e o Let.

Evitando vazamentos de memória

Observe, no código acima, que o bloco de memória associada a CString a variável de quadro desalocado automaticamente e não mostra como um vazamento de memória. A desalocação automática associada a regras de escopo se encarrega de maioria dos vazamentos de memória associados a variáveis de quadro.

Para objetos alocados na pilha, no entanto, você deve explicitamente excluir o objeto para impedir que um vazamento de memória. Para limpar o último vazamento de memória no exemplo anterior, exclua o CPerson objeto alocado no heap, da seguinte maneira:

{
    // Do your memory allocations and deallocations.
    CString s("This is a frame variable");
    // The next object is a heap object.
    CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
    delete p;
}

Consulte também

Referência

_CrtMemDumpAllObjectsSince

Conceitos

Despejos de objeto

Outros recursos

Detecção de vazamento de memória no MFC