Pergunta sobre o código g ++ gerado
Pergunta
Caro g hackers ++, eu tenho a seguinte pergunta.
Quando alguns dados de um objeto é substituído por um programa com defeito, por que o programa eventualmente falhar na destruição desse objeto com um erro de livre dobro? Como ele sabe se os dados forem corrompidos ou não? E por que isso causa double livre?
Solução
Não é geralmente que a memória do objeto é substituído, mas alguma parte do lado de fora de memória do objeto. Se as estruturas de controle deste sucessos de malloc, livre vai surtar quando ele acessa-los e tenta fazer coisas estranhas com base na estrutura corrompida.
Se você realmente só memória objeto de substituição com coisas tolas, não há nenhuma maneira malloc / free saberia. Seu programa pode falhar, mas por outras razões.
Dê uma olhada valgrind . É uma ferramenta que emula a CPU e assiste a cada acesso à memória de anomalias (como tentar estruturas de controle de malloc substituir). É realmente fácil de usar, na maioria das vezes você acabou de começar seu programa dentro valgrind, antecedendo valgrind
na casca, e você economiza um monte de dor.
Em relação C ++: sempre se certificar de que você usa novo em conjunto com exclusão e, respectivamente, new [] em conjunto com delete []. Nunca misturá-las. coisas ruins vão acontecer, muitas vezes semelhantes ao que você está descrevendo (mas valgrind iria avisá-lo).