У меня здесь утечка памяти (интерполяция с GNU GSL)?

Я использую библиотеку GNU GSL для некоторой интерполяции.

double Interpolator::calculateInterpolant(const InterpTypes& TYPE)
{
    double interpolant;
    const int SIZE = predictor_.size();

    gsl_interp * interp = allocateInterpolationObject(TYPE, SIZE);
    gsl_interp_init(interp, &predictor_[0], &response_[0], SIZE);
    gsl_interp_accel * acc = gsl_interp_accel_alloc();
    interpolant = gsl_interp_eval(interp, &predictor_[0], &response_[0],  
        level_, acc);
    gsl_interp_free(interp);
    gsl_interp_accel_free(acc);
    return interpolant;
}

Меня интересует функция allocateInterpolationObject. Вот тело этой функции:

gsl_interp * allocateInterpolationObject(const InterpTypes& TYPE, 
    const int& SIZE)
{
    gsl_interp * interp;
    switch (TYPE){
        case LINEAR:
            interp = gsl_interp_alloc(gsl_interp_linear, SIZE);
            break;
        case CSPLINE:
            interp = gsl_interp_alloc(gsl_interp_cspline, SIZE);
            break;
        case AKIMA:
            interp = gsl_interp_alloc(gsl_interp_akima, SIZE);
            break;
    }
    return interp;
}

Я знаю, что где-то в моей программе происходит утечка памяти, и я подозреваю, что это может быть здесь, потому что я не освобождаю объект interp внутри функции allocateInterpolationObject (хотя я освобождаю его в функции calculateInterpolant). Но как я могу освободить что-то, прежде чем вернуть его? Я «новичок в указателях», и мне не помешали бы некоторые советы или разъяснения. Спасибо.


person nonremovable    schedule 12.01.2016    source источник


Ответы (1)


Я знаю, что где-то в моей программе происходит утечка памяти, и я подозреваю…

… Остановись прямо там. Никогда не пытайтесь работать над такими вещами по подозрению. Обычно ты ошибаешься. Воспользуйтесь отладчиком памяти, чтобы определить, какое выделение вы упускаете, проследите за тем, как передается выделенный объект (и указатели на него), и в тот момент, когда последний указатель «отбрасывается», добавьте свободный.

Также для отладки памяти можно использовать Valgrind. Используй это.

Но как я могу освободить что-то, прежде чем вернуть его?

Вы не знаете.

alloc / free - это не то, что должно быть сбалансировано на уровне области действия для каждой функции. Правило состоит в том, что все, что выделяется, должно быть в конечном итоге освобождено, но когда это должно произойти, зависит от вас.

person datenwolf    schedule 12.01.2016