Вопрос о сгенерированном коде g ++ - PullRequest
1 голос
/ 25 ноября 2008

Уважаемые хакеры g ++, у меня следующий вопрос.

Когда некоторые данные объекта перезаписываются неисправной программой, почему программа в конечном итоге завершается ошибкой при уничтожении этого объекта с ошибкой двойного освобождения? Как он узнает, повреждены ли данные или нет? И почему это вызывает двойное освобождение?

1 Ответ

3 голосов
/ 25 ноября 2008

Обычно память объекта не перезаписывается, а какая-то часть памяти вне объекта. Если это затрагивает управляющие структуры malloc, free выйдет из строя, как только получит доступ к ним и попытается сделать странные вещи, основываясь на поврежденной структуре.

Если бы вы действительно перезаписывали объектную память только глупыми вещами, malloc / free не знал бы об этом. Ваша программа может зависнуть, но по другим причинам.

Взгляните на valgrind . Это инструмент, который эмулирует процессор и отслеживает каждый доступ к памяти на предмет аномалий (например, попытки перезаписать управляющие структуры malloc). Он действительно прост в использовании, в большинстве случаев вы просто запускаете свою программу в valgrind, добавляя valgrind в оболочку, и это избавляет вас от боли.

Что касается C ++: всегда , убедитесь, что вы используете new в сочетании с delete и, соответственно, new [] в сочетании с delete []. Никогда не путайте их. Произойдут плохие вещи, часто похожие на то, что вы описываете (но valgrind предупредит вас).

...