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。我没有编译包装器代码,它可能无法正常工作。
答案 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)
如果您在编译时不知道分配器和解除分配器函数是什么,那么只需将它们传递给构造函数并存储为成员数据。