Partilhar via


Estrutura CMemoryState

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Oferece uma forma prática de detetar fugas de memória no seu programa.

Sintaxe

struct CMemoryState

Membros

Construtores Públicos

Nome Description
CMemoryState::CMemoryState Constrói uma estrutura semelhante a uma classe que controla os checkpoints de memória.

Métodos Públicos

Nome Description
CMemoryState::Checkpoint Obtém um snapshot (checkpoint) do estado atual da memória.
CMemoryState::D ifference Calcula a diferença entre dois objetos do tipo CMemoryState.
CMemoryState::D umpAllObjectsSince Faz um resumo de todos os objetos atualmente atribuídos desde um checkpoint anterior.
CMemoryState::D umpEstatísticas Imprime estatísticas de alocação de memória para um CMemoryState objeto.

Observações

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

Uma "fuga de memória" ocorre quando a memória de um objeto é alocada no heap mas não é desalocada quando já não é necessária. Tais fugas de memória podem eventualmente levar a erros de falta de memória. Existem várias formas de alocar e desalocar memória no seu programa:

  • Usando a malloc/ free família de funções da biblioteca de tempo de execução.

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

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

Os CMemoryState diagnósticos apenas ajudam a detetar fugas de memória causadas quando a memória alocada pelo new operador não é desalocada usando delete. Os outros dois grupos de funções de gestão de memória são para programas não C++, e não é recomendado misturá-las com new e delete dentro do mesmo programa. Uma macro adicional, DEBUG_NEW, é fornecida para substituir o new operador quando for necessário rastrear ficheiros e números de linha das alocações de memória. DEBUG_NEW é usado sempre que normalmente usaria o new operador.

Tal como noutros diagnósticos, os CMemoryState diagnósticos só estão disponíveis em versões de depuração do seu programa. Uma versão de depuração deve ter a constante _DEBUG definida.

Se suspeitar que o seu programa tem uma fuga de memória, pode usar as Checkpointfunções , Difference, e DumpStatistics para descobrir a diferença entre o estado de memória (objetos alocados) em dois pontos diferentes da execução do programa. Esta informação pode ser útil para determinar se uma função está a limpar todos os objetos que aloca.

Se simplesmente saber onde ocorre o desequilíbrio na alocação e deslocação não fornecer informação suficiente, pode usar a DumpAllObjectsSince função para despejar todos os objetos alocados desde a chamada anterior para Checkpoint. Este dump mostra a ordem de alocação, o ficheiro fonte e a linha onde o objeto foi alocado (se estiver a usar DEBUG_NEW para alocação), e a derivação do objeto, o seu endereço e o seu tamanho. DumpAllObjectsSince também chama a função de Dump cada objeto para fornecer informação sobre o seu estado atual.

Para mais informações sobre como usar CMemoryState e outros diagnósticos, consulte Depuração de Aplicações MFC.

Observação

Declarações de objetos do tipo CMemoryState e chamadas a funções membros devem ser enquadradas por #if defined(_DEBUG)/#endif diretivas. Isto faz com que os diagnósticos de memória sejam incluídos apenas nas compilações de depuração do seu programa.

Hierarquia de herança

CMemoryState

Requerimentos

Cabeçalho: afx.h

CMemoryState::Checkpoint

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

void Checkpoint();

Observações

As CMemoryState funções membros Difference e DumpAllObjectsSince usam estes dados snapshot.

Example

Veja o exemplo do construtor CMemoryState .

CMemoryState::CMemoryState

Constrói um objeto vazio CMemoryState que deve ser preenchido pelas funções de membro Checkpoint ou Difference .

CMemoryState();

Example

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

CMemoryState::D ifference

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

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

Parâmetros

Velho Estado
O estado inicial da memória definido por um CMemoryState checkpoint.

novo Estado
O novo estado de memória definido por um CMemoryState ponto de controlo.

Valor de retorno

Não nulo se os dois estados de memória forem diferentes; caso contrário, 0.

Observações

O checkpoint deve ter sido chamado para cada um dos dois parâmetros de estado de memória.

Example

Veja o exemplo do construtor CMemoryState .

CMemoryState::D umpAllObjectsSince

Chama a Dump função para todos os objetos de um tipo derivado da classe CObject que foram alocados (e ainda são) desde a última chamada Checkpoint para este CMemoryState objeto.

void DumpAllObjectsSince() const;

Observações

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

Example

Veja o exemplo do construtor CMemoryState .

CMemoryState::D umpEstatísticas

Imprime um relatório conciso de estatísticas de memória a partir de um CMemoryState objeto que é preenchido pela função membro Diferença .

void DumpStatistics() const;

Observações

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

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

  • Blocos livres

  • blocos normais

  • Blocos CRT

  • ignorar blocos

  • Blocos de clientes

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

  • Memória total atualmente utilizada pelo programa (em bytes)

Os blocos livres são o número de blocos cuja desalocação foi atrasada se afxMemDF foi definido para delayFreeMemDF. Para mais informações, consulte afxMemDF, na secção "MFC Macros and Globals".

Example

O seguinte código deve ser colocado no projnameApp.cpp. Defina as seguintes variáveis globais:

static CMemoryState oldstate, newstate, diffstate;

Na InitInstance função, adicione a linha:

oldstate.Checkpoint();

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

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

Agora pode executar o programa em modo Debug para ver a saída da DumpStatistics função.

Consulte também

Gráfico de Hierarquia