为什么 boost::scoped_ptr 或 std::unique_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 ,此时为 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的用途),要么跟踪已删除的地址,这意味着它们仍在使用某种内存,并没有真正释放。

相关内容

  • 没有找到相关文章

最新更新