2015-10-19 3 views
2

Я получаю segmentation fault в своем приложении, а при тестировании с образцовыми приложениями я обнаружил, что ссылка на объект после освобождения не приводит к ошибке сегментации. Ниже приводится тестовый код, который я бегу,Почему не возникает ошибка segfault при передаче объекта после бесплатного?

hash_node *node_obj=new hash_node(); 
delete node_obj; 
node_obj->var1=0; 
return 0; 

Я просто перегружен new использовать malloc и delete использовать free. Может кто-нибудь, пожалуйста, посоветуйте мне в этом?

ответ

2

Доступ к местоположению в памяти с помощью указателя, который был удален/освобожден, является неопределенным поведением. Неопределенное поведение не означает, что произойдет segfault.

0

Это неопределенное поведение, поэтому вы не можете ожидать здесь ошибки сегментации. Вы можете обратиться «Дизайн и эволюция C++» Страуструп, который говорит:

Это невозможно изменить то, что ссылка относится к после инициализации. То есть, после инициализации ссылки на C++ не может быть сделано для ссылки на другой объект позже; его нельзя переопределить. Я в прошлом укусил ссылки Algol68, где R1 = R2 может либо назначить через r1 к объекту, упомянутых или присвоить новое опорное значение для r1 (повторное связывание r1) в зависимости от типа r2. I хотел избежать таких проблем на C++.

0

вина Сегментация происходит, когда процесс пытается получить доступ к ячейке памяти, которые его не предполагают, чтобы. Память за пределами области, выделенной для процесса.


В вашем коде доступ к уже освобожденной памяти является Неопределенным Поведением.