我正在使用GSL库来编写一些C代码。我注意到使用GSL库在我的代码中分配,释放和分配变量时,请注意某种不一致的不一致(至少是从我对C的有限知识中)。当第一个分配在循环内部时,情况正常,例如
int i;
for(i=1; i < 101; i++){
gsl_matrix * W = gsl_matrix_alloc(10,10);
gsl_matrix_free(W);
}
在另一个功能中,我在循环之前具有初始分配,
int i;
gsl_matrix * W = gsl_matrix_alloc(10,10);
for(i=1; i < 101; i++){
gsl_matrix_free(W);
gsl_matrix * W = gsl_matrix_alloc(10,10);
}
,它行不通。最后,如果我在循环中取出gsl_matrix *
,则可以使用。例如
int i;
gsl_matrix * W = gsl_matrix_alloc(10,10);
for(i=1; i < 101; i++){
gsl_matrix_free(W);
W = gsl_matrix_alloc(10,10);
}
有人有解释吗?为什么循环内部或外部的第一个分配位置很重要?
您的编译器应给您发出警告,并提示解释 - 效果是,libe W
在loop内部在循环内部声明的变量W
在循环外声明。
第二个循环不起作用的原因是您要重新启动W
,而不是重新分配它。这就是为什么只有第一个迭代正确释放矩阵W
的原因;随后的迭代释放悬空指针,导致不确定的行为。
从第二行中删除gsl_matrix *
使其按预期进行重新分配,因此代码再次起作用。
请注意,W
指向最后分配的矩阵,需要释放以避免记忆泄漏:
gsl_matrix * W = gsl_matrix_alloc(10,10);
for(i=1; i < 101; i++){
gsl_matrix_free(W);
W = gsl_matrix_alloc(10,10); // re-assign
}
gsl_matrix_free(W); // Avoid memory leaks