c ++中的异常证明赋值运算符

时间:2014-04-11 06:29:09

标签: c++ exception variable-assignment

以下是Scott Meyer共享的赋值运算符的异常证明方法。任何人都可以告诉我,删除原始指针是否安全?

int *orig =m_p; 
m_p=new int (*obj.m_p);
delete orig;

2 个答案:

答案 0 :(得分:2)

问题的问题在于,您无法告诉m_p最初包含的内容。如果某个&intVar获得了它的值,那么答案是:NO。如果该值已由new生成但已经delete d且未设置为NULL,则答案为NO。如果值未定义,则答案是另一个NO。

这样可以保证安全。

答案 1 :(得分:0)

如果没有原始指针

是的你have to delete it,这是安全的。您可以再做一件事,即在删除它之后将其设置为0,因为删除后将它们设置为0是一个很好的做法,除了析构函数 (因为包含指针的对象实例无论如何都会消失)。该标准允许删除NULL 指针(它什么都不做),任何带内存管理的好操作系统都会导致程序崩溃 首先取消引用(读或写)NULL指针。所以现在由你的要求决定你如何去做它

如果没有原始指针

建议不要使用原始指针,还可以使用其他替代方法,就像使用托管指针类而不是原始指针一样。 std :: auto_ptr<&gt ;, boost :: scoped_ptr<&gt ;, boost :: shared_ptr<>, boost :: weak_ptr<&gt ;, boost :: intrusive_ptr<&gt ;,std :: unique_ptr<> (C ++ 0X)。即使在具有大量内存分配的数百万个线路项目中,也可以使用它,甚至它们很少需要删除任何东西;所有指针都是管理的。