Bjö*_*lex 28 c++ 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的问题的讨论.
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)
Éri*_*ant 11
用户应该拥有该对象的所有权.我不想返回Boost.shared_ptr,
shared_ptr表示共享所有权,您希望您的界面表达所有权转移.std::auto_ptr因此在这里更适用.
但是,在内部,我想将指针存储在shared_ptr中,以防止在异常情况下发生内存泄漏
同样,shared_ptr可能不是这项工作的最佳工具.在异常的情况下防止泄漏,scoped_ptr或者auto_ptr更适合.
对资源 ( )使用 ashared_ptr到 a 。这样你就得到了的引用计数,当且仅当它仍然附加到. 但是当您准备好移交所有权时,您可以分离。scoped_ptrshared_ptr<scoped_ptr<Resource>>shared_ptrscoped_ptrscoped_ptr
| 归档时间: |
|
| 查看次数: |
26508 次 |
| 最近记录: |