为什么boost :: scoped_ptr或std :: unique_ptr是不可复制的?

时间:2013-10-03 21:05:37

标签: c++ smart-pointers scoped-ptr

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在它退出示波器后负责删除指向的对象。 ?? !!

1 个答案:

答案 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的用途),或者跟踪哪些地址具有被删除了,这意味着他们仍然在使用某种类型的内存并没有真正释放。 ]