4

我正在尝试将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);
4

2 回答 2

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 没有实现无状态 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 );
     }
   );
于 2012-06-25T17:04:44.207 回答
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
);
于 2012-06-25T16:59:55.037 回答