分配,释放,分配变量
Allocate, free, allocate variable
我正在使用 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);
}
有人解释一下吗?为什么第一个分配的位置在循环内部或外部很重要?
您的编译器应该给您一个警告并提示解释 - 某些效果是在循环内重新声明的变量 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
我正在使用 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);
}
有人解释一下吗?为什么第一个分配的位置在循环内部或外部很重要?
您的编译器应该给您一个警告并提示解释 - 某些效果是在循环内重新声明的变量 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