2010-11-25 2 views
3
double a[] = { 0.11, 0.12, 0.13, 
        0.21, 0.22, 0.23 }; 

    double b[] = { 1011, 1012, 
        1021, 1022, 
        1031, 1032 }; 

    double c[] = { 0.00, 0.00, 
        0.00, 0.00 }; 

    gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3); 
    gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2); 
    gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2); 

    /* Compute C = A B */ 

    gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 
        1.0, &A.matrix, &B.matrix, 
        0.0, &C.matrix); 

어떻게 행렬에 할당 된 메모리를 할당 해제합니까?C++ 및 GNU 과학 라이브러리 코드의 메모리 누출 제거하기

+3

할당을 취소 할 메모리는 어디에서 할당 했습니까? 코드 스 니펫에는 할당이 표시되지 않습니다. –

+1

GSL이 행렬 계산에 메모리를 할당하면 더 이상 필요하지 않을 때 메모리가 해제됩니다. –

답변

2

컴파일러는 이러한 행렬을 처리합니다. malloc()/new[] 또는 malloc()/new[]을 사용하는 함수를 사용하지 않고 할당 된 메모리의 소유권을 제공하지 않으면 메모리가 누출 될 가능성이 없습니다.

gsl_matrix_view_array()에 대한 질문 - 반환 값은 원래 행렬의 뷰에 대한 포인터이므로 여분의 행렬이 할당되지 않음을 의미합니다. 동일한 행렬에 포인터 만 가져옵니다. 그러므로 malloc()/new을 사용하여 원래의 행렬을 할당하지 않았다면 아무 것도해서는 안됩니다. 원래 행렬에 malloc()/new[]을 사용하는 경우 (해당하지 않지만 어쨌든) -보기가 아닌 원래 행렬에 free()/delete[]으로 전화하십시오.

+0

Erm,'new', 셜리? (이것은'C++'태그를 가지고 있습니다.) – sbi

+0

@sbi : 코드를보고 라이브러리에 C 인터페이스가 있다고 생각했기 때문에 C++에 대해 생각하지 않았습니다. 결정된. – sharptooth

+0

예, 질문에'C++ '대신'c' 태그가 있어야합니다. 그러나'C++'태그를 가지고 있기 때문에 ... – sbi