Estrutura CMemoryState

Proporciona uma maneira conveniente de detectar vazamentos de memória no programa.

Sintaxe

struct CMemoryState

Membros

Construtores públicos

Nome Descrição
CMemoryState::CMemoryState Constrói uma estrutura semelhante a uma classe que controla os pontos de verificação de memória.

Métodos públicos

Nome Descrição
CMemoryState::Checkpoint Obtém um instantâneo (ponto de verificação) do estado de memória atual.
CMemoryState::Difference Calcula a diferença entre dois objetos do tipo CMemoryState.
CMemoryState::DumpAllObjectsSince Despeja um resumo de todos os objetos alocados atualmente desde um ponto de verificação anterior.
CMemoryState::DumpStatistics Imprime estatísticas de alocação de memória de um objeto CMemoryState.

Comentários

CMemoryState é uma estrutura e não tem uma classe base.

Um "vazamento de memória" ocorre quando a memória de um objeto é alocada no heap, mas não é desalocada quando deixa de ser necessária. Esses vazamentos de memória podem, eventualmente, levar a erros de memória insuficiente. Há várias maneiras de alocar e desalocar memória no programa:

  • Usando a família malloc/ free de funções da biblioteca de runtime.

  • Usando as funções de gerenciamento de memória da API do Windows, LocalAlloc/ LocalFree e GlobalAlloc/ GlobalFree.

  • Usando os operadores new e delete de C++.

O diagnóstico de CMemoryState ajuda apenas a detectar vazamentos de memória causados quando a memória alocada usando o operador new não é desalocada usando delete. Os outros dois grupos de funções de gerenciamento de memória são para programas não C++ e não é recomendável misturá-los com new e delete no mesmo programa. Uma macro adicional, DEBUG_NEW, é fornecida para substituir o operador new quando você precisa ter acompanhamento de arquivo e de número de linha nas alocações de memória. DEBUG_NEW é usado sempre que você normalmente usaria o operador new.

Assim como acontece com outros diagnósticos, o diagnóstico CMemoryState só está disponível nas versões de depuração do programa. Uma versão de depuração precisa ter a constante _DEBUG definida.

Se você suspeitar de que o programa tem um vazamento de memória, poderá usar as funções Checkpoint, Difference e DumpStatistics para descobrir a diferença entre o estado de memória (objetos alocados) em dois pontos diferentes na execução do programa. Essas informações podem ser úteis para determinar se uma função está limpando todos os objetos que aloca.

Se apenas saber onde ocorre o desequilíbrio na alocação e na desalocação não fornecer informações suficientes, você poderá usar a função DumpAllObjectsSince para despejar todos os objetos alocados desde a chamada anterior para Checkpoint. Esse despejo mostra a ordem de alocação, o arquivo de origem e a linha em que o objeto foi alocado (se você está usando DEBUG_NEW para alocação), bem como a derivação do objeto, seu endereço e seu tamanho. DumpAllObjectsSince também chama a função Dump de cada objeto para fornecer informações sobre seu estado atual.

Para obter mais informações sobre como usar CMemoryState e outros diagnósticos, consulte Depurando aplicativos MFC.

Observação

Declarações de objetos do tipo CMemoryState e chamadas para funções membro devem ser colocadas entre colchetes por diretivas #if defined(_DEBUG)/#endif. Isso faz com que o diagnóstico de memória seja incluído somente em builds de depuração do programa.

Hierarquia de herança

CMemoryState

Requisitos

Cabeçalho: afx.h

CMemoryState::Checkpoint

Faz um resumo de instantâneo da memória e o armazena neste objeto CMemoryState.

void Checkpoint();

Comentários

As funções membro CMemoryStateDifference e DumpAllObjectsSince usam esses dados de instantâneo.

Exemplo

Consulte o exemplo do construtor CMemoryState.

CMemoryState::CMemoryState

Constrói um objeto CMemoryState vazio que deve ser preenchido pela função membro Checkpoint ou Difference.

CMemoryState();

Exemplo

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::Difference

Compara dois objetos CMemoryState e armazena a diferença nesse objeto CMemoryState.

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

Parâmetros

oldState
O estado de memória inicial, conforme definido por um ponto de verificação CMemoryState.

novoEstado
O novo estado de memória, conforme definido por um ponto de verificação CMemoryState.

Valor de Devolução

Diferente de zero se os dois estados de memória forem diferentes; caso contrário, 0.

Comentários

O ponto de verificação precisa ter sido chamado para cada um dos dois parâmetros de estado de memória.

Exemplo

Consulte o exemplo do construtor CMemoryState.

CMemoryState::DumpAllObjectsSince

Chama a função Dump para todos os objetos de um tipo derivados da classe CObject que foram alocados (e ainda estão alocados) desde a última chamada de Ponto de verificação para esse objeto CMemoryState.

void DumpAllObjectsSince() const;

Comentários

Chamar DumpAllObjectsSince com um objeto CMemoryState não inicializado despejará todos os objetos atualmente na memória.

Exemplo

Consulte o exemplo do construtor CMemoryState.

CMemoryState::DumpStatistics

Imprime um relatório conciso de estatísticas de memória de um objeto CMemoryState preenchido pela função membro Difference.

void DumpStatistics() const;

Comentários

O relatório, que é impresso no dispositivo afxDump, mostra o seguinte:

Um relatório de exemplo fornece informações sobre o número (ou a quantidade) de:

  • blocos livres

  • blocos normais

  • blocos CRT

  • blocos ignorados

  • blocos de cliente

  • memória máxima usada pelo programa a qualquer momento (em bytes)

  • memória total usada atualmente pelo programa (em bytes)

Blocos livres são o número de blocos cuja desalocação foi atrasada se afxMemDF foi definido como delayFreeMemDF. Para obter mais informações, consulte afxMemDF, na seção "Macros e globais do MFC".

Exemplo

O código a seguir deve ser colocado em projnameApp.cpp. Defina as seguintes variáveis globais:

static CMemoryState oldstate, newstate, diffstate;

Na função InitInstance, adicione a linha:

oldstate.Checkpoint();

Adicione um manipulador para a função ExitInstance e use o seguinte código:

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

Agora, você pode executar o programa no modo de depuração para ver a saída da função DumpStatistics.

Confira também

Gráfico da hierarquia