Despejos de objeto
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. |
Em um programa do MFC, você pode usar CMemoryState::DumpAllObjectsSince para despejo uma descrição de todos os objetos na heap não desalocada. DumpAllObjectsSince descarta todos os objetos alocados desde a última CMemoryState::Checkpoint. Se nenhum Checkpoint telefonar for realizada, DumpAllObjectsSince descarta todos os objetos e nonobjects atualmente na memória.
Observação: |
---|
Antes de usar MFC despejando de objeto, você deve habilitar Como: Ativar diagnóstico de memória. |
Observação: |
---|
MFC Despeja vazados todos os objetos automaticamente quando seu programa for encerrado, portanto, você não precisa criar código para despejar objetos naquele ponto. |
O código a seguir testa um perda de memória, comparando dois estados de memória e descarta todos os objetos se for detectado um vazamento.
Código de Exemplo Legado
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
O Sumário de despejo de tem esta aparência:
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
{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long
Programação robusta
Os números nas chaves no início da maioria das linhas especificam a ordem na qual os objetos foram alocados.O objeto alocado mais recentemente possui o maior número e aparece na parte superior do despejo.See Interpretação de despejo de objeto para uma análise mais detalhada desse exemplo.
Para obter o máximo de informações de um despejo do objeto, você pode substituir o Dump função de membro de qualquer CObject-derivados do objeto para Personalização de despejo de objeto.
Você pode conjunto um ponto de interrupção em uma alocação de memória específico, definindo a variável global_afxBreakAlloc o número mostrado das chaves. Se você executar novamente o programa o depurador interromperá a execução quando ocorre a alocação.Em seguida, você pode examinar a pilha de chamadas para ver como seu programa obteve esse ponto.
A biblioteca de time de execução C tem uma função semelhante, _CrtSetBreakAlloc, que pode ser usado para alocações de time de execução C.