2012-01-26 4 views
4

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

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

'int * p1 = new myClass();' Если 'myClass' является typedef для' int', как это может работать? – ildjarn

+0

извините, я использовал int изначально, отредактировал пост – user1171946

ответ

6

Удалить заботится только о адрес, так что ваш код является совершенно законным.

3

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

1

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

6

Безопасно?

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

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

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

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