将 std::unique_ptr 与自定义分配器一起使用,以包装原始指针
Using std::unique_ptr with a custom deallocator for wrapping raw pointers
我正在尝试将libsvm用于某个复杂的应用程序,并且由于libsvm主要是C库,因此在加载某些数据后,必须使用自定义API函数来释放内存。我的意思是:
struct svm_model *model;
model = svm_load_model("path to model file");
//do some processing
svm_free_and_destroy_model(&this->model);
这些是我使用的libsvm API函数的定义:
struct svm_model *svm_load_model(const char *model_file_name);
void svm_free_and_destroy_model(struct svm_model **model_ptr_ptr);
虽然这工作得很好,但如果在我处理模型数据时发生异常,那么我最终会出现内存泄漏。为了防止这种情况,我将上面的代码包装在一个类中,我在构造函数中调用svm_load_model
,在析构函数中调用svm_free_and_destroy_model
。
现在,由于我们处于智能指针的时代,我想变得更有创意,并且以某种方式将模型变量声明为std::unique_ptr
,将指向svm_free_and_destroy_model
的指针设置为自定义分配器,但不幸的是,我无法弄清楚这样的事情是否可行。目前,我什至无法编译它,我只是在黑暗中拍摄。以下是我认为它应该如何工作:
std::unique_ptr<struct svm_model *, /* what should I add here? */ > model (svm_load_model("path to model file"), svm_free_and_destroy_model);
std::unique_ptr
的类型参数需要T
,而不是T *
。使用 lambda 调用删除程序函数。
std::unique_ptr<svm_model, void(*)(svm_model *)>
p( svm_load_model( "path_to_model" ),
[]( svm_model *mdl ) {
svm_free_and_detroy_model( &mdl );
}
);
由于VS2010没有实现无状态lambda到函数指针的转换,因此您必须使用std::function
才能使其正常工作。
std::unique_ptr<svm_model, std::function<void(svm_model*)>>
p( svm_load_model("path_to_model"),
[]( svm_model *mdl ) {
svm_free_and_destroy_model( &mdl );
}
);
unique_ptr
的删除器应该是一个只接受指针的函数,而不是指向指针的指针。你可以试试:
void svm_deleter(svm_model*& model)
{
svm_free_and_detroy_model(&model);
}
....
std::unique_ptr< svm_model, void(*)(svm_model*&) >(
svm_load_model("path to model file")
, &svm_deleter
);
相关文章:
- C结构,其指针将被包装在unique_ptr中
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 如何包装多级原始指针以赋予其容器语义
- SDL 包装标头中的智能指针
- 将捕获的 lambda 包装为模板函数中的函数指针
- 智能指针包装CoTaskMemAlloc和CoTaskMemFree
- 包装 C API 通过C++接受迭代器的函数获取原始指针
- std::带有指向成员函数和back_inserter的指针的转换包装器
- 如何使用指针作为参数在 C# 中包装C++ DLL?
- 重置/包装 C/C++ 中的变量(环缓冲区指针)
- 使用可变参数模板(gcc、clang)的成员函数指针包装器
- Qvariant包装指针在QML中变为null
- C 11 / 14-是否有针对其他地方管理的资源的原始指针包装器
- 编写安全包装类以管理用户定义对象的指针
- 用Cython包装C 类时处理指针
- 为什么编译器不优化琐碎的包装器函数指针?
- 简单包装类与智能指针
- 字符指针包装器的运算符>>
- 通过简单的包装指针C++智能指针性能和差异
- 如何使用右值引用包装指针