2017-10-04 113 views
1

我正在使用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); 
} 

有没有人有解释?为什么在循环内部或外部放置第一个分配很重要?

回答

1

你的编译器应该给你一个警告,提示解释 - 在循环内重新声明的变量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