从shared_ptr中分离指针?

Bjö*_*lex 28 c++ boost shared-ptr

可能重复:
如何从boost :: shared_ptr释放指针?

我的接口函数返回一个指向对象的指针.用户应该拥有该对象的所有权.我不想返回Boost.shared_ptr,因为我不想强制客户端使用boost.但是,在内部,我想将指针存储在shared_ptr中,以防止在异常等情况下发生内存泄漏.似乎无法从共享指针中分离指针.这里有什么想法?

Jam*_*lis 26

你正在寻找的是一个release功能; shared_ptr没有发布功能. 根据Boost手册:

问:为什么shared_ptr不提供release()函数?

A. shared_ptr不能放弃所有权,除非它是唯一的(),因为另一个副本仍将销毁该对象.

考虑:

shared_ptr<int> a(new int);
shared_ptr<int> b(a); // a.use_count() == b.use_count() == 2

int * p = a.release();

// Who owns p now? b will still call delete on it in its destructor.
Run Code Online (Sandbox Code Playgroud)

此外,release()返回的指针很难可靠地解除分配,因为源shared_ptr可能是使用自定义删除器创建的.

您可以考虑两个选项:

  • 您可以使用std::tr1::shared_ptr,这将要求您的用户使用支持TR1的C++库实现使用Boost; 至少这会给他们两者之间的选择.
  • 您可以实现自己boost::shared_ptr的共享指针,并在外部接口上使用它.

您还可以查看有关在库的公共接口中使用boost :: shared_ptr的问题的讨论.

  • shared_ptr有点像const关键字,将它添加到一个地方,你必须在任何地方使用它 (6认同)

Mag*_*nus 24

总有办法:-)

他们确实没有提供release()方法,但创建一个并不是不可能的.制作自己的删除者.有些东西(实际上没有编译代码,但这是一般概念):

template <typename T>
class release_deleter{
public:
  release_deleter() : released_(new some_atomic_bool(false)){}
  void release() {released_->set(true);}
  void operator()(T* ptr){if(!released_->get()) delete ptr;}
private:
  shared_ptr<some_atomic_bool> released_;
}

..

shared_ptr<some_type> ptr(new some_type, release_deleter<some_type>());

..

release_deleter<some_type>* deleter = get_deleter<release_deleter<some_type>>(ptr);
deleter->release();
some_type* released_ptr = ptr.get();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我最终得到了这个更加严肃的版本,不会对删除操作进行硬编码:http://paste.ubuntu.com/23866812/ (4认同)

Éri*_*ant 11

用户应该拥有该对象的所有权.我不想返回Boost.shared_ptr,

shared_ptr表示共享所有权,您希望您的界面表达所有权转移.std::auto_ptr因此在这里更适用.

但是,在内部,我想将指针存储在shared_ptr中,以防止在异常情况下发生内存泄漏

同样,shared_ptr可能不是这项工作的最佳工具.在异常的情况下防止泄漏,scoped_ptr或者auto_ptr更适合.


Ben*_*igt 5

对资源 ( )使用 ashared_ptr到 a 。这样你就得到了的引用计数,当且仅当它仍然附加到. 但是当您准备好移交所有权时,您可以分离。scoped_ptrshared_ptr<scoped_ptr<Resource>>shared_ptrscoped_ptrscoped_ptr

  • @curiousguy:您在智能指针上使用 `*` 的频率如何?通常你使用`-&gt;`,它具有链接语义。无论如何,问题中不需要完全相同的语法,这具有完全像 OP 想要的那样工作的优点。 (2认同)