自动释放资源的通用句柄

时间:2015-07-10 22:21:14

标签: c++ boost stl

STL或boost中是否存在泛型句柄类?我正在与一些具有alloc,release api的C代码连接。我想使用句柄来自动释放资源。

例如:

some_resource_type rsc;  
int err = capi_alloc(&rsc);
if (err != NOERR) {
   // .. do work with resource

   capi_release(rsc);
}  

我想要像

这样的东西
// looking for this class
class wrapper { 
public:
     wrapper(T obj, void (del)(T&)):obj(obj_),del_(del) {}
     ~wrapper() {_del(obj);}
     T obj_;
     void (del_)(T&);
};

some_resource_type rsc;  
int err = capi_alloc(&rsc);
wrapper w;
if (err != NOERR) {
    w = wrapper(rsc, &capi_release);
    // .. do work with resource
}  
// then auto release
在STL或者提升中有类似的东西吗?它本质上是一些独特的指针实现,具有自定义创建和自定义删除。

P.S。我没有编译包装器代码,它可能无法正常工作。

3 个答案:

答案 0 :(得分:1)

你想要的是一个智能指针,这些都是最近的C ++和几乎所有可用的Boost变体;如果您使用的是C ++ 11,请将boost替换为std

  • boost::shared_ptr
  • boost::weak_ptr

答案 1 :(得分:1)

您实际上可以(ab)使用excit_pn[i] = new double *[num_x]; 及其第二个模板参数(自定义解除分配器):

std::unique_ptr

然后在std::unique_ptr<some_resource_type, void (&)(some_resource_type*)> w(nullptr, &capi_release);

if

但请注意:必须w.reset(&rsc); 之后使用此方法声明w 。否则,rsc会在rsc调用w之前销毁capi_release

但是,由于这不是unique_ptr的预期用法,我建议只编写一个小包装类,如我的其他答案中所示。

答案 2 :(得分:0)

由于std::unique_ptr仅支持堆分配而没有自定义分配器,因此您可以汇总自己的基于堆栈的包装类:

template<class T, int (& Allocator)(T*), void (& Deallocator)(T*)>
class wrapper {
public:
    wrapper() : err_(Allocator(&obj_)) {}
    ~wrapper() { if (err_ != NOERR) Deallocator(&obj_); }
    T& obj() { return obj_; }
    int err() { return err_; }
private:
    T obj_;
    int err_;
};

并像这样使用它:

wrapper<some_resource_type, capi_alloc, capi_release> rsc;  // capi_alloc called
if (rsc.err() != NOERR) {
    // .. do work with rsc.obj()
}
// capi_release called when rsc goes out of scope (if err_ != NOERR)

如果您在编译时不知道分配器和解除分配器函数是什么,那么只需将它们传递给构造函数并存储为成员数据。