Что произойдет, когда мы назначим указатель NULL? - PullRequest
3 голосов
/ 04 октября 2011

У меня есть указатель, который указывает на некоторые данные. Теперь я создал аналогичный указатель. Теперь этот новый указатель назначен старому. Если я удалю старую, что произойдет?

A* a = new A();
A* b = a;
a = NULL;

что будет с "а" и "б"?

Более того, если я сделаю следующие вещи:

A* a = new A();
A* b = a;
delete a;

А также я хочу знать, что происходит с указателем, когда мы присваиваем значение NULL.

A* a = new A();
a = NULL;

указывает ли еще на некоторую память или ничего не указывает?

Ответы [ 4 ]

14 голосов
/ 04 октября 2011
A* a = new A();
A* b = a;
a = NULL;

После этого b по-прежнему указывает на объект, выделенный в первой строке. a теперь ни на что не указывает. Вы по-прежнему можете «использовать» объект с помощью указателя b и удалить объект с помощью delete b;.
Вы можете delete a; здесь - это не будет иметь никакого эффекта (поскольку a равно NULL), но это безопасно и не приведет к неопределенному поведению.

A* a = new A();
A* b = a;
delete a;

После delete объект, на который a и b использовали для указания, больше не существует. Следовательно, a и b больше не являются действительными указателями, и вы не можете делать с ними ничего, что использует их значение. В частности, попытка разыменования любого указателя приведет к неопределенному поведению. (Но вы можете использовать переменные повторно, если вы сделаете так, чтобы они указывали на действительный объект.)

A* a = new A();
a = NULL;

Вы только что слили объект, созданный в первой строке. a больше не указывает ни на что, и у вас нет дескриптора этого объекта, поэтому вы не можете его удалить. Итак, это старая утечка памяти.
(Как и в первом случае, вы можете delete a; после строки a = NULL;, но это не будет иметь никакого эффекта, память все еще протекает.)

5 голосов
/ 04 октября 2011
A* a = new A();
A* b = a;
a = NULL;

что будет с "а" и "б"?

a будет НЕДЕЙСТВИТЕЛЕН, а b неизменен

A* a = new A();
A* b = a;
delete a;

*a был удален, а b стал недействительным (вы не должны разыменовывать b (*b) больше после этой точки).

А также я хочу знать, что происходит с указателем, когда мы присваиваем значение NULL.

A* a = new A();
a = NULL;

*a удаляется , а не , поэтому память просочилась. Память больше не может быть освобождена (если у вас не было копии указателя где-то еще, но код не показывает это).

2 голосов
/ 04 октября 2011
A* a = new A();
A* b = a;
a = NULL;

b продолжает указывать на A. a указывает на адрес 0x0, разыменование вызовет ошибку сегмента.

A* a = new A();
A* b = a;
delete a;

и a, и b указывают на адресное пространство, в котором A когда-то был создан. Теперь, когда A удален, вы не должны ни разыменовывать a, ни b, поскольку это может segfault.

A* a = new A();
a = NULL;

Теперь a указывает на адрес 0x0, а A теряется в киберпространстве. Вы слили память.


немного позже этого. еще раз.

1 голос
/ 04 октября 2011

@ apoorva "что если я назначу любой новый указатель на a, а затем сделаю ноль., А затем удалю."это не будет иметь никакого эффекта .. то есть вы не освободите память, занятую новым A (), просто потому, что a = null, и вы пытаетесь удалить a;который теперь содержит NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...