Memory leaks GSL中的内存泄漏

Memory leaks GSL中的内存泄漏,memory-leaks,gsl,Memory Leaks,Gsl,我正在使用GSL的GnuWin32包在我正在编写的一段代码中实现一些非线性拟合。我最近注意到我的代码中有一个内存泄漏,我将其追溯到一个函数,该函数调用GSL实现的用于非线性最小二乘拟合的Levenberg–Marquardt算法 这个函数本身非常简单,我确信在我的代码部分没有内存泄漏——这只剩下GSL代码本身是问题的根源 GSL中是否存在我不知道的已知内存泄漏问题 该函数是您可以找到的github repo的一部分。该函数在stepfit.c中,我在下面提供了一份相关部分的副本,为了便于阅读,去

我正在使用GSL的GnuWin32包在我正在编写的一段代码中实现一些非线性拟合。我最近注意到我的代码中有一个内存泄漏,我将其追溯到一个函数,该函数调用GSL实现的用于非线性最小二乘拟合的Levenberg–Marquardt算法

这个函数本身非常简单,我确信在我的代码部分没有内存泄漏——这只剩下GSL代码本身是问题的根源

GSL中是否存在我不知道的已知内存泄漏问题

该函数是您可以找到的github repo的一部分。该函数在stepfit.c中,我在下面提供了一份相关部分的副本,为了便于阅读,去掉了一些绒毛

void step_response(event *current, double risetime, uint64_t maxiters, double minstep)
{
#ifdef DEBUG
printf("StepResponse\n");
fflush(stdout);
#endif // DEBUG
if (current->type == STEPRESPONSE)
{
    //set up solver
    const gsl_multifit_fdfsolver_type *T;
    gsl_multifit_fdfsolver *s;
    int status = GSL_CONTINUE;
    uint64_t i,iter = 0;
    uint64_t p = 7;
    uint64_t n = current->length + current->padding_before + current->padding_after;
    double *weight;
    weight = calloc_and_check(n,sizeof(double),"Cannot allocate weight array");

    gsl_matrix *covar = gsl_matrix_alloc (p, p);

    gsl_multifit_function_fdf f;


    [...] //get data for initial guess


    for (i=0; i<n; i++)
    {
        if (i < start)
        {
            weight[i] = 1;
        }
        else if (i < end)
        {
            weight[i] = 0.3;
        }
        else
        {
            weight[i] = 1;
        }
    }
    struct data d = {n, current->signal,weight};
    //generate initial guess
    gsl_vector *x = gsl_vector_alloc(p);
    gsl_vector_set(x,0,baseline);
    gsl_vector_set(x,1,sign < 0 ? maxsignal - minsignal: minsignal - maxsignal);
    gsl_vector_set(x,2,start);
    gsl_vector_set(x,3,risetime);
    gsl_vector_set(x,4,sign < 0 ? maxsignal - minsignal: minsignal - maxsignal);
    gsl_vector_set(x,5,end - current->length/2);
    gsl_vector_set(x,6,risetime);


    f.f = &expb_f;
    f.df = &expb_df;
    f.fdf = &expb_fdf;
    f.n = n;
    f.p = p;
    f.params = &d;
    //allocate solver
    T = gsl_multifit_fdfsolver_lmsder;
    s = gsl_multifit_fdfsolver_alloc (T, n, p);
    gsl_multifit_fdfsolver_set (s, &f, x);

    //iterate solver
    while (iter < maxiters && status == GSL_CONTINUE)
    {
        iter++;
        status = gsl_multifit_fdfsolver_iterate (s);
        if (status)
        {
            break;
        }
        status = gsl_multifit_test_delta (s->dx, s->x,1e-3, 1e-3);
    }


    double i0 = FIT(0);
    double a = FIT(1);
    uint64_t u1 = FIT(2);
    double rc1 = FIT(3);
    double b = FIT(4);
    uint64_t u2 = FIT(5);
    double rc2 = FIT(6);
    double residual = 0;

    [...] //sanity chewcking and storing/printing results

    gsl_multifit_fdfsolver_free (s);
    gsl_matrix_free (covar);
    gsl_vector_free(x);
    free(weight);
    if (status != GSL_SUCCESS)
    {
        current->type = BADFIT;
    }
}
}
无效阶跃响应(事件*电流、双上升时间、uint64最大值、双分钟阶跃)
{
#ifdef调试
printf(“StepResponse\n”);
fflush(stdout);
#endif//DEBUG
如果(当前->类型==STEPRESPONSE)
{
//设置解算器
常量gsl_multifit_fdfsolver_type*T;
gsl_multifit_fdfsolver*s;
int status=GSL_CONTINUE;
uint64_t i,iter=0;
uint64_t p=7;
uint64\u t n=current->length+current->padding\u before+current->padding\u after;
双倍*重量;
权重=calloc_和_检查(n,sizeof(double),“无法分配权重数组”);
gsl_矩阵*covar=gsl_矩阵_alloc(p,p);
多比特函数;
[…]//获取初始猜测的数据
对于(i=0;isignal,weight};
//生成初始猜测
gsl_向量*x=gsl_向量alloc(p);
gsl_向量_集(x,0,基线);
gsl_向量_集(x,1,符号<0?maxsignal-minsignal:minsignal-maxsignal);
gsl_向量_集(x,2,开始);
gsl_向量_集(x,3,上升时间);
gsl_向量_集(x,4,符号<0?maxsignal-minsignal:minsignal-maxsignal);
gsl_向量_集(x,5,结束-当前->长度/2);
gsl_向量_集(x,6,上升时间);
f、 f=&expb\u f;
f、 df=&expb_df;
f、 fdf=&expb_fdf;
f、 n=n;
f、 p=p;
f、 参数=&d;
//分配求解器
T=gsl_multifit_fdfsolver_lmsder;
s=gsl_multifit_fdfsolver_alloc(T,n,p);
gsl_多比特fdfsolver_集(s,f,x);
//迭代求解器
而(iterdx,s->x,1e-3,1e-3);
}
双i0=配合(0);
双a=配合(1);
uint64_t u1=配合(2);
双rc1=配合(3);
双b=配合(4);
uint64_t u2=配合(5);
双rc2=配合(6);
双残差=0;
[…]//健康咀嚼和存储/打印结果
gsl多功能FDF解决方案免费;
gsl_无基质(covar);
gsl_矢量_自由(x);
自由(重量);
如果(状态!=GSL_成功)
{
当前->类型=不良;
}
}
}

你能发布一小段简单的示例代码,可能是函数本身吗?当然。函数有点长,但可读性很好。我还将通过指向github repo的链接进行编辑。你能发布一小段简单的示例代码,可能是函数本身吗?当然。函数有点长,但可读性很好。我将lso使用指向github repo的链接进行编辑。