Você está usando ponteiros inteligentes, como Boost shared_ptr
? Em caso afirmativo, verifique se você está usando diretamente o ponteiro bruto em qualquer lugar chamando get()
. Descobri que este é um problema bastante comum.
Por exemplo, imagine um cenário onde um ponteiro bruto é passado (talvez como um manipulador de retorno de chamada, digamos) para seu código. Você pode decidir atribuí-lo a um ponteiro inteligente para lidar com a contagem de referência, etc. Grande erro: seu código não possui este ponteiro a menos que você faça uma cópia profunda. Quando seu código estiver pronto com o ponteiro inteligente, ele irá destruí-lo e tentar destruir a memória para a qual aponta, uma vez que pensa que ninguém mais precisa dele, mas o código de chamada tentará excluí-lo e você obterá um duplo problema grátis.
Claro, esse pode não ser o seu problema aqui. Na sua forma mais simples, aqui está um exemplo que mostra como isso pode acontecer. A primeira exclusão está bem, mas o compilador percebe que essa memória já foi excluída e causa um problema. É por isso que atribuir 0 a um ponteiro imediatamente após a exclusão é uma boa ideia.
int main(int argc, char* argv[])
{
char* ptr = new char[20];
delete[] ptr;
ptr = 0;
delete[] ptr;
}
Edit: alterado delete
para delete[]
, pois ptr é um array de char.
NULL
ponteiros (que mascaram erros que de outra forma seriam detectados, como essa pergunta mostra), mas ninguém sugere simplesmente não fazer gerenciamento manual de memória, o que é muito bem possível em C ++. Eu não escrevo hádelete
anos. (E, sim, meu código é crítico para o desempenho. Caso contrário, não teria sido escrito em C ++.)