c ++ 2 указатели на один и тот же объект - PullRequest
1 голос
/ 07 февраля 2012

Мне интересно, если у меня есть 2 указателя, указывающие на один и тот же объект, и затем я удаляю его, используя указатель 1, он все еще будет в памяти, а указатель 2 будет указывать на ноль, или объект останется в памяти, и мне нужно использовать delete указатель 2, чтобы освободить его?

Я имею в виду:

int *p1, *p2;
p1=new int;
p2=p1;
*p1=5;
p2=p1;
delete p1;

int x=*p2;
//Error or x=5?

Ответы [ 2 ]

8 голосов
/ 07 февраля 2012
  • Объект будет ушел .
  • Указатель 2 будет не нулевым указателем, а висящим указателем с его предыдущим, но сейчас -Неверное значение;делать что-либо с этим будет ошибкой. 1
  • Это верно и для указателя 1.Между ними не будет никакой разницы.

1 - Ну, UB, а не "ошибка" как таковая.Но не делай этого.

1 голос
/ 07 февраля 2012

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

Все, что вы делаете с памятью после удаления, это неопределенное поведение .

В вашем случае (я полагаю, вы забыли сделать p2=p1, как подсказывает ваш вопрос), int x=*p2; не определено, поскольку память, на которую указывает p2, была удалена.

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