C ++重新分配指针然后删除它

时间:2012-01-26 18:33:06

标签: c++ pointers

这样安全吗?我的意思是删除只关心它给出的地址,还是删除原始指针变量很重要?

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

4 个答案:

答案 0 :(得分:6)

仅删除关于地址的关注,因此您的代码完全合法。

答案 1 :(得分:6)

  

这样安全吗?

工作。也就是说,它具有明确定义的行为并且不会泄漏(假设它编译)。

但安全吗?使用别名指针自由运行是一个危险的想法。您必须跟踪哪些指针已被删除,哪些指针未被删除;哪个指向被删除的内存,哪些没有。

使用支持RAII的句柄来管理动态分配的对象会更安全,例如std::unique_ptrstd::shared_ptr(或者提升替换)。 std::unique_ptr不允许别名,std::shared_ptr允许以安全的方式进行别名。

答案 2 :(得分:3)

由于p1和p2指向同一个对象,如果你通过p2 delete,你也会删除指向p1的内容。所以这是正确的。

答案 3 :(得分:1)

这很好。您已将内存分配给p1,然后在p2中引用了SAME内存。当您在p2上调用delete时,p1也被删除的内存(它们是相同的东西,位置和所有内容)。将它们都设置为NULL也是正确的,因为删除p1之后可能会导致一些问题,因为它不再指向有效的内存。