我在这里泄漏记忆(用GNU GSL插值)?

时间:2016-01-12 17:30:42

标签: c++ pointers 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(即使我在{{{ 1}}功能)。但是如何在返回之前释放一些东西呢?我是指针新手"我可以在这里使用一些建议或澄清。谢谢。

1 个答案:

答案 0 :(得分:0)

  

我知道我在程序的某个地方泄漏了记忆,我怀疑......

......停在那儿。永远不要试图怀疑这样的事情。你经常是错的。使用内存调试器来确定它正在泄漏哪个分配,遵循分配的对象(及其指向)的传递方式,以及最后一个指针被“删除”的时刻添加空闲。

内存调试的首要任务是Valgrind。使用它。

  

但是如何在返回之前释放一些东西?

你没有。

alloc / free不是必须在每个功能范围级别上平衡的东西。规则是,所有获得分配的东西必须最终免费,但是当这种情况发生时,由你决定。