2017-10-02 16 views
1

xgboostをC_APIで使用していますが、コード内でメモリリークの原因を見つけようとしています。 は、私は次のコードを持っている:xgboostで関数に割り当てられたメモリを解放する方法

//関数定義/ c_api.cc

XGB_DLL int XGBoosterPredict(BoosterHandle handle, 
DMatrixHandle dmat, 
int option_mask, 
unsigned ntree_limit, 
xgboost::bst_ulong *len, 
const bst_float **out_result) 
{ 
    std::vector<bst_float>& preds = XGBAPIThreadLocalStore::Get()- 
    >ret_vec_float; 
    API_BEGIN(); 
    Booster *bst = static_cast<Booster*>(handle); 
    bst->LazyInit(); 
    bst->learner()->Predict(
     static_cast<std::shared_ptr<DMatrix>*>(dmat)->get(), 
     (option_mask & 1) != 0, 
     &preds, ntree_limit, 
     (option_mask & 2) != 0, 
     (option_mask & 4) != 0); 
    *out_result = dmlc::BeginPtr(preds); 
    *len = static_cast<xgboost::bst_ulong>(preds.size()); 
    API_END(); 
} 

// XGBoosterPredict // h_boosterを呼び出している主な機能には、h_testは

正しく定義されています
const float *f; 
XGBoosterPredict(h_booster, h_test, 0, 0, &out_len, &f); 

//

インサイドXGBoosterPredictポインタに割り当てられている次

std::vector<bst_float>& preds = XGBAPIThreadLocalStore::Get()->ret_vec_float; 
*out_result = dmlc::BeginPtr(preds); 

質問:fに割り当てるメモリを解放する正しい方法は何ですか?

答えて

0

無料ではありません。*f

dmlc::BeginPtr(preds)は、静的に割り当てられたメモリ(つまり、XGBAPIThreadLocalStore::Get()の意味)を表すpredsのアドレスを安全に返します。したがって、ここでメモリを解放することを心配する必要はありません。

メモリリークが他の問題によって発生しているようです。

関連する問題