C ++ переназначить указатель и удалить его - PullRequest
4 голосов
/ 26 января 2012

Это безопасно и правильно? Я имею в виду, что удаление заботится только об адресе, который ему дан, или важно удалить исходную переменную-указатель?

myClass *p1 = new myClass();
myClass *p2 = p1;
delete p2;
p1 = NULL;
p2 = NULL;

Ответы [ 4 ]

6 голосов
/ 26 января 2012

Это безопасно и правильно?

Это работает . То есть он имеет четко определенное поведение и не дает утечек (при условии, что он компилируется).

Но безопасно? Это - опасная идея иметь свободные псевдонимы-указатели. Вы должны отслеживать, какие указатели были удалены, а какие нет; которые указывают на память, которая была удалена, а какая нет.

Гораздо безопаснее использовать дескрипторы с поддержкой RAII для управления динамически размещенными объектами, такими как std::unique_ptr и std::shared_ptr (или ускоренные замены). std::unique_ptr не позволяет создавать псевдонимы, а std::shared_ptr позволяет создавать безопасные псевдонимы.

6 голосов
/ 26 января 2012

Удалить заботится только о адресе , поэтому ваш код совершенно легален.

3 голосов
/ 26 января 2012

Поскольку p1 и p2 указывают на один и тот же объект, то, если вы delete пройдете через p2, вы также удалили то, на что указал p1.Так что это правильно.

1 голос
/ 26 января 2012

Это нормально.Вы выделили память для p1, а затем сослались на ту же самую память в p2.Когда вы вызывали delete на p2, память, которую p1 также удаляла (это одно и то же, местоположение и все).Также верно, что вы установили для них обоих значение NULL, так как удаление p1 в противном случае могло вызвать некоторые проблемы, поскольку оно больше не указывало на действительную память.

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