Como verificar a desalocação de memory

Como verificar se a memory para qual ponteiro p pontos foi desalocada com sucesso?

Em poucas palavras: você não pode.

Confira as ferramentas como Valgrind para ajudá-lo a depurar problemas de vazamentos de memory.

Algumas outras coisas que você deve considerar:

  • Use pointers inteligentes para que você não pense sobre gerenciamento de memory,
  • Defina seus pointers para 0 depois de liberá-los, para que uma delete adicional não tenha efeito,
  • Use classs padrão ( vector , …) em vez de rolar suas próprias
  • Finalmente, não use pointers (na verdade você quase consegue)

Desculpe, resposta muito curta “Você não pode”

Use a ferramenta de purificação racional da IBM para verificar a correta desalocação da memory.

Defina com sucesso! Definir desalocado!

Depois de desalocar a memory (se é livre ou excluir) você não deve usar esse ponteiro novamente. Todas as outras suposições são irrelevantes.

Afinal, você chama o tempo de execução C / C ++ para desalocar memory, mas o tempo de execução C / C ++ também chama funções do sistema operacional para liberar a página. Você pode até mesmo ter um alocador de memory personalizado no topo do tempo de execução C / C ++ que, por exemplo, usa o armazenamento em cache para implementar um algoritmo de alocação de memory mais rápido.

Todas essas camadas podem manter a memory desalocada para si (devido à fragmentação ou apenas porque gostam de mantê-la para si) ou podem informar a camada subjacente para desalocá-la. Tudo pode acontecer, só não use mais esse ponteiro.

  1. Algumas ferramentas que estão fazendo análise de código estático podem apontar alguns problemas relacionados à desalocação de memory.
  2. Use valgrind para verificar se você tem vazamentos de memory
  3. Evite pointers brutos – use pointers inteligentes

Em C ++, você pode seguramente assumir que a desalocação nunca falha. Os destruidores não devem lançar exceções, e a memory real reservada nunca deve deixar de ser liberada, então, dados esses dois pontos, nada pode dar errado.

No entanto, se você excluir um ponteiro que já foi excluído, seu programa provavelmente falhará. Isso não é um problema com a própria desalocação – a delete original funcionou com sucesso. É um problema com o gerenciamento de memory do seu programa se ele tentar excluir um ponteiro duas vezes, mas isso raramente é necessário com STL moderno e pointers inteligentes como std::vector , std::unique_ptr , etc …

Manipulação de exceção. Ou seja, tente / pegar blocos.