在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
的析构函数将delete
someclass
对象。 紧接着,p
超出范围,其析构函数将再次delete
someclass
对象。
delete
同一个指针是无效的!(除非new
碰巧在此期间再次归还它)。
[如果任何C++实现试图使其有效,它要么必须将所有具有相同值的原始指针链接在一起(这就是shared_ptr
的用途),要么跟踪已删除的地址,这意味着它们仍在使用某种内存,并没有真正释放。