c++ - 为什么 boost::scoped_ptr 或 std::unique_ptr 不可复制?

标签 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 ,此时它是 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 的析构函数将删除 某个类 对象。然后紧接着,p 超出范围,它的析构函数将再次删除 someclass 对象。

删除同一个指针两次是无效的! (除非 new 同时碰巧再次返回它)。

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

关于c++ - 为什么 boost::scoped_ptr 或 std::unique_ptr 不可复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169225/

相关文章:

c++ - 在二进制数据(密文)上使用 CryptoPP::Base64Encoder

c++ - unique_ptr vector 的赋值运算符

c++ - 重新分配智能指针

c++ - 升序排序,c++,带 vector

c++ - 如何在 C++ 中创建具有非标准顺序的整数集?

c++ - Qt 4.8.4 如何检查http服务器上是否存在文件

c++ - 添加两个智能指针有没有更好的方法?

c++ - 在简单的情况下使用 scoped_ptr 是否有点矫枉过正?

c++ - 使用 boost 侵入式指针初始化数组的最 STYLish 方式

c++ - 带 malloc 和 free 的 shared_ptr