C-分配,免费,分配变量



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

相关内容

  • 没有找到相关文章

最新更新