Despejos de objeto
This topic applies to:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Native only |
||||
Pro, Premium e Ultimate |
Native only |
Em um programa do MFC, você pode usar CMemoryState::DumpAllObjectsSince para despejar uma descrição de todos os objetos na heap não ter sido desalocada. DumpAllObjectsSincedespejos de todos os objetos alocados desde a última CMemoryState::Checkpoint. Se nenhum Checkpoint chamada tiver sido feita, DumpAllObjectsSince descarta todos os objetos e nonobjects atualmente na memória.
Observação |
---|
Antes de usar o despejo de objeto MFC, você deve habilitar Como: Habilitar o diagnóstico de memória. |
Observação |
---|
MFC Despeja perdidos todos os objetos automaticamente quando sai de seu programa, portanto você não precisa criar o código para despejar objetos naquele ponto. |
O código a seguir testa um vazamento de memória, comparando dois estados de memória e descarta todos os objetos se for detectado um vazamento.
Legacy Code Example
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
O conteúdo do despejo 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
Robust Programming
Os números nas chaves no início da maioria das linhas especificam a ordem na qual os objetos foram alocados. O objeto alocado recentemente tem o maior número e aparece na parte superior do despejo. Consulte Interpretação de despejo do objeto para uma análise mais detalhada deste exemplo.
Para obter o máximo de informações de despejo de um objeto, você pode substituir o Dump a função de membro de qualquer CObject-derivado de objeto para Personalização de despejo do objeto.
Você pode definir um ponto de interrupção em uma alocação de memória específico, definindo a variável global _afxBreakAlloc o número mostrado em chaves. Se você executar novamente o programa o depurador interromperá a execução quando a alocação. Em seguida, você pode examinar a pilha de chamadas para ver como seu programa obteve esse ponto.
A biblioteca de tempo de execução c tem uma função semelhante, _CrtSetBreakAlloc, que você pode usar para alocações de tempo de execução C.