Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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/freefamí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/LocalFreee .GlobalAlloc/GlobalFreeUsando o C++
newedeleteos 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.