在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在它退出示波器后负责删除指向的对象。 ?? !!
答案 0 :(得分:1)
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
}
当函数结束(return或throw)并且q
超出范围时,q
的析构函数将delete
someclass
个对象。然后,紧接着,p
超出范围,其析构函数将再次delete
someclass
个对象。
对delete
两次相同的指针无效! (除非new
碰巧在此期间再次返回)。
[并且如果任何C ++实现试图使其有效,它将要么必须将所有原始指针链接在一起具有相同的值(这是shared_ptr
的用途),或者跟踪哪些地址具有被删除了,这意味着他们仍然在使用某种类型的内存并没有真正释放。 ]