2010-12-03 1 views
1

여기 내 코드에서 무슨 일이 일어 났는지 설명 할 수 있습니까? 구조체에서 소멸자를 올바르게 사용하고 있는지 잘 모르겠습니다. 거기에 소멸자와구조체에서 gsl 벡터 할당 해제

내가 얻을 :
기능 1 : 23
기능 2 : 8.86183e-317
*의 glibc가 감지 ./a : 더블 무료 또는 손상 (fasttop) : 0x000000000111b010 * *

난 그냥 소멸자을 주석 경우

내가 얻을 :
기능 1 : 23
기능 2 : 24

내가 원하는거야. 그러나 더 복잡한 프로그램을 위해 메모리 누수를 피하기 위해 소멸자가 필요하지 않습니까?

감사 (당신은 내가 일반적으로 포인터/할당에 약간의 혼동이 될 수 있습니다 볼 수 있듯이)!

편집 : 오 그래, function1의 추가 할당 단계가 다른 이유는 무엇입니까?

편집 2 : 생성자에서 x = 0으로 초기화해야합니까? 나는 그것이 적절하다고 생각했다. 내가 이것을 할 때 초기화 할 때 할당해야 하는가? 그래서 대신 : x = gsl_vector_alloc (1).

#include <iostream> 
    using namespace std; 
#include <cassert> 
#include <cmath> 
#include <gsl/gsl_vector.h> 

struct struct1{ 
    gsl_vector * x; 

    struct1() { 
     x = 0; 
    } 
    ~struct1() { 
     if (x) gsl_vector_free(x); 
    } 
}; 

void function1(void *p) { 
    struct1 s = *(struct1 *) p; 
    s.x = gsl_vector_alloc(1); 
    gsl_vector_set(s.x, 0, 24); 
} 

void function2(void *p) { 
    struct1 s = *(struct1 *) p; 
    gsl_vector_set(s.x, 0, 24); 
} 

int main() { 
    struct1 s; 
    s.x = gsl_vector_alloc(1); 
    gsl_vector_set(s.x, 0, 23); 

    function1(&s); 
    cout << "function1: " << gsl_vector_get(s.x, 0) << endl; 

    function2(&s); 
    cout << "function2: " << gsl_vector_get(s.x, 0) << endl; 

    return 0; 
} 
+0

왜 '무효 *'를 사용하고 있습니까? –

답변

1
function1의 내부

function2 당신이 main() 기능에서 만든 struct1 객체의 복사본을 만든다. 이 사본들은 동일한 포인터 x을가집니다. sfunction2 한 번

  • 을 파괴 할 때 s 인 경우 function1에 한 번

    • :이 사본 각각에 대한 소멸자가 호출 될 때 같은 포인터에 세 번 호출 할 수 있도록, gsl_vector_free가 호출된다 s

    을 파괴 할 때 복사 생성자를 구현해야하고이 클래스의 대입 연산자를 복사 main

  • 한 번 파괴 . 리소스를 소유하는 클래스가 있으면 언제든지이 두 함수와 소멸자를 구현해야합니다. 리소스는 리소스 사용을 마쳤을 때 정리해야하는 모든 것입니다.

    예제 코드에서 클래스 내부에서 모든 할당 및 할당 취소를 캡슐화하면 클래스를 걱정없이 사용할 수 있습니다. 클래스가 실제로 리소스를 관리하도록합니다.

  • +0

    하지만 구조체 (클래스)를 초기화 할 때 벡터 x가 얼마나 커야할지 모르겠다면 어떻게해야할까요? 크기 1에 할당 한 다음 나중에 어떤 크기를 사용해야 할지를 결정할 때 다시 할당하는 것은 나쁜 생각입니까? – evencoil

    +0

    @evencoil :'resize()'멤버 함수를 제공 할 수 있습니까? –

    +0

    나는 그 이유가 무엇인지 모르겠다 ... 나는 그 일을하는 방법을 알고 있다고 생각한다. 나는해야한다는 것을 알지 못했다. alloc (1), alloc (5)와는 반대로 alloc (1), free, alloc (5)의 차이점은 무엇입니까? 과거에는 이것이 gsl_vectors에 문제가되는 것을 발견하지 못했습니다 ....하지만 그만큼의 경험은 없습니다. – evencoil