在boost::scoped_ptr中,说“它提供了一个基本的‘资源获取即初始化’设施,没有共享所有权或所有权转移语义。” 它是通过一些不可复制的机制完成的。
我的问题是为什么不需要共享所有权?
这就是我的意思:
template <typename T>
class my_scoped_ptr
{
public:
// constructor implemented not shown here
// operator*() implemented not shown here
// operator -> implemented not shown here
~my_scoped_ptr()
{
delete my_p;
my_p = NULL;
}
private:
T * my_p;
};
void foo()
{
my_scoped_ptr<someclass> p (new someclass());
my_scoped_ptr<someclass> q (p); // both p & q point to same my_p object
// may be an exception is raised
}
现在好了,无论是否引发异常, my_p 都将被删除。因此,当代码超出 foo 的范围时 ...my_scope_ptr p 析构函数被调用,删除 my_p 并将 my_p 设置为 null。现在再次调用 my_scope_ptr q 析构函数删除 my_p ,此时它为空。在销毁时,我似乎不太关心剩余的复制指针是否指向有效对象。
那么,为什么我需要关心 my_scoped_ptr 不应该是可复制的呢?如果 ptr 负责删除指向的对象,一旦它退出范围,我认为 ptr 是可复制的没有任何危害。??!!