可能的重复:
如何发布指针,从提升::情况?

一功能的,我的口返回指向一个对象。用户是应该采取的所有权,对象。我不想要返回的一个提升。情况,因为我不想强迫客户使用提升。国内但是,我想存储的指针在的情况,以防止泄漏内存在情况下的例外情况等等。似乎没有任何方法来分离一个指从一个共用的指针。任何想法,在这里?

有帮助吗?

解决方案

什么你在寻找的是一个 release 功能; shared_ptr 没有释放的功能。 每升手册:

问:为什么不让情况提供一个release()function?

A.情况不能放弃所有权,除非它是唯一的()因为其他复制仍然会破坏对象。

考虑:

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.

此外,返回的指针,通过释放()将难以释放可靠的来源的情况可能已经创建了一个自定义删除器.

两个选择你可能会考虑:

  • 你可以用 std::tr1::shared_ptr, 这将要求用户使用C++库的执行行动,支持TR1 使用提高;至少这能让他们选择这两者之间。
  • 你能实现你自己的 boost::shared_ptr-如共用的指针,并用于在外部接口。

你可能还在讨论这个问题 使用提升::情况在图书馆的公共接口.

其他提示

总有一种方法: - )

有的确是一个原因,他们不提供一个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();
  

在用户应该采取对象的所有权。我不想返回Boost.shared_ptr,

shared_ptr表达的共享的所有权,并希望您的interface来表示的转移的所有权。因而std::auto_ptr会更适用于此。

  

内部然而,我想指针存储在一个shared_ptr以防止内存泄漏在例外的情况下,

再次shared_ptr可能不是该工作的最佳工具。为了防止在例外的情况下泄露,scoped_ptrauto_ptr会更适合。

使用一个shared_ptrscoped_ptr到资源(shared_ptr<scoped_ptr<Resource>>)。这样,你得到shared_ptr的引用计数,它会自动销毁资源,当且仅当它仍然附着在scoped_ptr。但是,当你准备交班的所有权可以分离的scoped_ptr

如詹姆斯以及覆盖你不能真正分离共享指针。

您是否需要多个所有者内部,或者从你的类将所有权转移给客户?在这种情况下一个std::auto_ptr可能适合的纸币。

如果你担心std::auto_ptr的令人惊讶的语义,你可以通过内部持有boost::scoped_ptr它,在你的手出来的点上拆除 - 留给了客户端手动删除或贮存在自己的智能指针。

如果你有在你身边多业主可以使用一个侵入式计数。在内部,你可以再使用boost::intrusive__ptr,但手头宽裕接口处的原始指针。该客户端可以手动与裁判计数工作,或者其存储在一个boost::intrusive_ptr本身(但你没有让他们依赖于它)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top