题
可能的重复:
如何发布指针,从提升::情况?
一功能的,我的口返回指向一个对象。用户是应该采取的所有权,对象。我不想要返回的一个提升。情况,因为我不想强迫客户使用提升。国内但是,我想存储的指针在的情况,以防止泄漏内存在情况下的例外情况等等。似乎没有任何方法来分离一个指从一个共用的指针。任何想法,在这里?
解决方案
什么你在寻找的是一个 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_ptr
或auto_ptr
会更适合。
使用一个shared_ptr
到scoped_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
本身(但你没有让他们依赖于它)