【发布时间】:2017-03-12 12:11:24
【问题描述】:
很多HDF5函数初始化如下
hid_t handler = DoSomething(someHandler);
并且必须手动释放由此类操作保留的内存,使用类似:
freeme(handler);
因此,使用malloc 和/或new 运算符会带来同样的噩梦/问题。
我想创建类似unique_ptr 的东西来处理这个问题。 问题是,每个不同的函数都有不同的释放函数。
例如:
hid_t attribType = H5Aget_type(attribHandler);
必须被释放
H5Tclose(attribType);
但是这个函数
attribHandler = H5Aopen(obj_id,"name",H5P_DEFAULT);
必须被释放
H5Aclose(attribHandler);
所以我需要编写一个可以将hid_t作为模板参数的类(这很容易),也可以将释放函数作为某种参数,并在销毁时调用它。
实现这一目标的最佳方法是什么?
更新
有人建议我将std::unique_ptr 与自定义删除器一起使用,但这不起作用,因为std::unique_ptr 需要一个指针。
std::unique_ptr<hid_t,std::function<herr_t(hid_t)>> attribType(H5Aget_type(attribHandler), [](hid_t f) { return H5Tclose(f); });
由于第二个参数 lambda 函数,这会产生编译错误。错误说(g++ 4.9):
error: invalid conversion from ‘hid_t {aka int}’ to ‘std::unique_ptr<int, std::function<int(int)> >::pointer {aka int*}’ [-fpermissive]
std::unique_ptr<hid_t,std::function<herr_t(hid_t)>> attribType(H5Aget_type(attribHandler), [](hid_t f) { return H5Tclose(f); });
^
发生错误是因为std::unique_ptr 期望持有指向hid_t 的指针,而不是hid_t 对象。
有没有办法解决这个问题?我想我现在可以编写自己的类来执行此操作(我可以使用 std::function 来回答我的第一个问题),但如果我可以使用 std::unique_ptr 那就太好了。
【问题讨论】:
-
std::unique_ptr将删除器作为额外的模板参数。std::shared_ptr将删除器作为可选的额外构造函数参数。 -
@IgorTandetnik 哦!让我试试看!
-
@IgorTandetnik 请检查更新。
-
"
std::unique_ptr需要一个指针" False。std::unique_ptr<T, Deleter>与Deleter::pointer一起使用,它可能是也可能不是T*。您需要投入更多的工作来创建合适的自定义删除器。
标签: c++ smart-pointers hdf5 hdf