在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 ,此时它是 null 。 似乎在销毁时我不太关心剩余的复制指针是否指向有效对象。
那么,为什么我需要注意 my_scoped_ptr 不应该是可复制的?我不认为 ptr 可复制有任何危害,如果 ptr 负责删除指向的对象,一旦它退出范围。 ??!!
最佳答案
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
}
当函数结束(返回或抛出)并且 q
超出范围时,q
的析构函数将删除
某个类
对象。然后紧接着,p
超出范围,它的析构函数将再次删除
someclass
对象。
删除
同一个指针两次是无效的! (除非 new
同时碰巧再次返回它)。
[ 如果任何 C++ 实现试图使其有效,它要么必须将所有具有相同值的原始指针链接在一起(这就是 shared_ptr
的用途),要么跟踪哪些地址已被删除,这意味着它们仍在使用某种内存并且没有真正释放。 ]
关于c++ - 为什么 boost::scoped_ptr 或 std::unique_ptr 不可复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169225/