使用std :: unique_ptr和自定义deallocator包装原始指针

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)

Pra*_*ian 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 ); 
     } 
   );
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)