2012-01-26 34 views
4

这是安全和正确的吗?我的意思是删除只关心它给出的地址,还是删除原始指针变量很重要?C++重新指定指针然后删除它

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

'int * p1 = new myClass();'除非'myClass'是'int'的typedef,这怎么可能工作? – ildjarn

+0

对不起,我最初使用int,编辑后 – user1171946

回答

6

删除只关心地址,所以你的代码是完全合法的。

3

由于p1和p2指向相同的对象,因此如果您delete它通过p2,您也将删除指向p1的内容。所以这是正确的。

1

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

6

这是安全和正确的吗?

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

但安全吗?这是一个危险想法有别名指针运行免费。你必须跟踪哪些指针已被删除,哪些不是;这指向已被删除但没有的内存。

使用RAII启用的句柄来管理动态分配的对象(如std::unique_ptrstd::shared_ptr(或增强替换))要安全得多。 std::unique_ptr不允许别名,并且std::shared_ptr允许以安全方式混叠。