我正在使用GSL库编写一些C代码。我在使用GSL库在代码中分配,释放和分配变量时,注意到某种不一致(至少来自我对C的有限知识)。当第一次分配在循环内部时,一切正常,例如
list_status
# JavaObject id=o40
在另一个函数中,我在循环之前进行了初始分配,
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);
}
,它就可以了。 E.g。
gsl_matrix *
有没有人有解释?为什么第一个分配在循环内部或外部的位置很重要?
答案 0 :(得分:2)
你的编译器应该给你一个警告,提示解释 - 在循环中重新声明的变量W
隐藏了在循环外声明的变量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