Mih*_*dor 4 c c++ pointers unique-ptr libsvm
我正在尝试将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);
Run Code Online (Sandbox Code Playgroud)
这些是我使用的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);
Run Code Online (Sandbox Code Playgroud)
虽然这很好用,但如果在处理模型数据时发生异常,那么我最终会遇到内存泄漏.为了防止这种情况,我将上面的代码包装在一个类中,我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);
Run Code Online (Sandbox Code Playgroud)
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 );
}
);
Run Code Online (Sandbox Code Playgroud)
由于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 );
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |