1

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 是可复制的没有任何危害。??!!

4

1 回答 1

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
 }

当函数结束(返回或抛出)并q超出范围时,析构函数将q对象。然后立即超出范围,其析构函数再次将对象。deletesomeclasspdeletesomeclass

delete两次对同一个指针无效!(除非new在此期间碰巧再次退回)。

[如果任何 C++ 实现试图使其有效,它要么必须将所有具有相同值的原始指针链接在一起(这就是shared_ptr目的),要么跟踪已删除的地址,这意味着它们是仍在使用某种内存并没有真正释放。]

于 2013-10-04T00:56:11.973 回答