Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top