Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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. |
Observe este objeto despejo 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 somente duas alocações explícitas — um na pilha e outra 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" );
The CPerson construtor utiliza três argumentos são apontadores para char, que são usados para inicializar CString variáveis de membro. O despejo de memória, você pode ver o CPerson objeto com três blocos nonobject (3, 4 e 5). Esses Isenção os caracteres para o CString variáveis de membro e não serão excluídas quando o CPerson objeto destruidor é invocado.
bloco número 2 é de CPerson objeto propriamente dito. $51A4 representa o endereço do bloco e é seguido pelo Sumário do objeto, que foram saída CPerson::Dump Quando chamado por DumpAllObjectsSince.
Você pode imaginar que o número de blocos 1 está associado a CString variável de quadro por causa de seu número de sequência e dimensionar, que corresponde ao número de caracteres no quadro CString variável. Variáveis alocadas no quadro são desalocadas automaticamente quando o quadro sai do escopo.
Variáveis de quadro
Em geral, você não deve preocupe heap objetos associados ao quadro variáveis porque eles são automaticamente desalocados quando as variáveis de quadro está fora do escopo.Para evitar 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, entre colchetes escopo sistema autônomo 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();
Entre colchetes escopo no lugar, o despejo de memória para esse exemplo é o seguinte:
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
Alocações nonobject
Observe que algumas alocações de objetos (sistema autônomo, por exemplo, CPerson) e alguns são nonobject alocações. "Alocações nonobject"são sistema autônomo alocações de objetos não derivados deCObject ou alocações de C tipos primitivos sistema autônomo char, int, ou longo.Se o CObject- derivado classe aloca espaço adicional, sistema autônomo por buffers internos, esses objetos mostrará sistema autônomo alocações de objeto e nonobject.
Impedir o vazamento de memória
Observe, no código acima, que o bloco de memória associada a CString quadro variável tiver sido desalocada automaticamente e não é exibido sistema autônomo um perda de memória. A desalocação automático associada com as regras de escopo cuida da maioria dos vazamentos de memória associados ao quadro variáveis.
Para objetos alocados na heap, no entanto, você deve explicitamente excluir o objeto para impedir que um perda de memória.Para limpar o último perda de memória no exemplo anterior, exclua o CPerson objeto alocado no heap, da seguinte forma:
{
// 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;
}
.gif)
.gif)
.gif)