Я использую 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 ??
Вы не должны освобождать *f
,
dmlc::BeginPtr(preds)
безопасно возвращает адрес preds
, который представляет статически распределенную память (вот что XGBAPIThreadLocalStore::Get()
делает), так что вам не нужно беспокоиться об освобождении памяти здесь.
Похоже, что утечка памяти вызвана какой-то другой проблемой.
Других решений пока нет …