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