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