2017-10-02 4 views
1

J'utilise xgboost avec C_API et j'essaie de trouver une source de fuite de mémoire dans mon code. J'ai le code suivant:Comment libérer de la mémoire allouée dans une fonction

// définition de la fonction dans 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(); 
} 

// Dans les fonctions principales qui appelle XGBoosterPredict // h_booster, h_test sont correctement définis

const float *f; 
XGBoosterPredict(h_booster, h_test, 0, 0, &out_len, &f); 

//

intérieur XGBoosterPredict ce qui suit est attribué au pointeur:

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

Question: Quelle est la bonne façon de libérer de la mémoire allouée à f ??

Répondre

0

Vous n'êtes pas censé libérer *f.

dmlc::BeginPtr(preds) retourne en toute sécurité l'adresse de preds, qui représente la mémoire allouée statiquement (c'est ce que XGBAPIThreadLocalStore::Get() fait), de sorte que vous n'avez pas besoin de vous soucier de libérer de la mémoire ici.

Il semble que votre fuite de mémoire soit causée par un autre problème.