gpt4 book ai didi

c++ - HDF5 函数和智能析构函数 - std::unique_ptr()

转载 作者:行者123 更新时间:2023-11-30 03:37:09 25 4
gpt4 key购买 nike

很多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 就更好了。

最佳答案

也许是这样的:

struct MyDeleter {
typedef hid_t pointer;
typedef void (*FreeFunc)(hid_t);
FreeFunc free_func_;

MyDeleter(FreeFunc free_func) : free_func_(free_func) {}
void operator()(hid_t f) const { free_func_(f); }
};

std::unique_ptr<hid_t, MyDeleter> p(
H5Aget_type(attribHandler),
MyDeleter(H5Tclose));

关于c++ - HDF5 函数和智能析构函数 - std::unique_ptr(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40324760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com