2017-10-04 132 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