2014-11-01 2 views
-2

Я изучал создание объекта с указателем с использованием динамического выделения. И я читал, что, когда объект создается один раз и дважды удаляется, память кучи повреждена. что значит испорченное? Это похоже на утечку памяти или это что-то еще?Удаление объекта-указателя разлагает память кучи

int main() 
{ 
    //consider my class name is sample 
    sample *p= new sample; 
    //some code 
    delete p; 
    //some code 
    delete p; 
} 

Когда я удаляю p в первый раз, память, на которую указывает p, очищается и безопасно возвращается в кучу. что произойдет в следующий раз?

ответ

1

Бесплатный магазин представляет собой тщательно управляемую систему свободных и выделенных блоков, а новые и удаленные делают бухгалтерию, чтобы сохранить все в согласованном состоянии. Если вы снова удалите, система, скорее всего, сделает ту же самую учетную запись на недопустимых данных, и вдруг бесплатный магазин находится в противоречивом состоянии. Это называется «кучевое повреждение».

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

Безопасная ставка всегда устанавливает указатель на нуль после удаления.

int *ptr = new int; 
// do something 
delete ptr; 
ptr = null; 
+0

предложит 'nullptr' вместо' null'. Это определенно безопасно, потому что удаление nullptr явно поддерживается стандартом как не имеющее effetct. – Christophe

Смежные вопросы