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
eGlobalAlloc
/GlobalFree
.Usando os operadores
new
edelete
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 CMemoryState
Difference 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
.
novo Estado
O novo estado de memória, conforme definido por um ponto de verificação CMemoryState
.
Valor de retorno
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
.