我正在尝试将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);
答案 0 :(得分:5)
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没有实现无状态lambdas到函数指针的转换,所以你必须使用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 );
}
);
答案 1 :(得分:0)
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
);