2012-06-12 4 views
2

벡터 멤버 변수가 들어있는 클래스가 있습니다. 스택에 저장된 벡터는 (즉, 메모리 free'd)이 범위를 벗어날 때 정리되지만 벡터 멤버 변수가 포함 된 클래스 개체가 삭제되는지는 확실하지 않습니다. - 은 범위를 벗어나는 것으로 간주됩니다.C++ 소멸자에서 벡터 클래스 멤버 메모리 삭제

그렇지 않으면 벡터를 파괴하는 적절한 방법은 무엇입니까?

EG :

class fred { 
    char *stuff; 
    vector<int> v; 

    fred() : stuff(), v() {} 
    ~fred() { 
     if (stuff) free(stuff); 
     // now how do I clear up the vector v? Will it be done automatically? 
    } 
} 
+2

태그가 어떻게 C++로되어 있는지보고 싶다면'malloc/free'를 통해'new/delete '를 원할 수도 있습니다. – chris

+2

벡터가 좋습니다. 그러나'stuff '는 복사 생성자와 대입 연산자 때문에 (컴파일러가 자동으로 생성하기 때문에) 안전하지 않습니다. 3의 규칙 (또는 C++ 11의 5)을 참조하십시오. –

+1

새로운 세상에서, C++ 11-land, 더 이상 당신 자신을'delete'라고 부르지 않습니다. 당신은 unique_ptrs (보통) 또는 shared_ptrs (드물게)를 사용하여 그것을 호출합니다. – David

답변

0

당신이 프레드의 인스턴스를 파괴 할 때 벡터의 소멸자가 호출됩니다.

+2

'v'가 반드시 스택에있는 것은 아닙니다! 그것은 fred의이 인스턴스가 스택에 할당되었는지 여부에 따라 달라집니다. – David

+0

아 맞아! 그 케이스를 고려하지 않았다 : ( 고마워. – mtahmed

+0

그는 자동 스토리지 지속 시간 즉, 스택 할당 인스턴스가있는 경우 * fred 인스턴스를 폐기 할 필요가 없을 수도 있습니다. – Praetorian

5

벡터가 이미 정리되어 있습니다! 클래스가 파괴되면 모든 멤버가 소멸자가 호출됩니다. 이 경우 v의 소멸자가 호출되어 할당 된 내용이 정리됩니다.

비 정적 멤버의 dtors는 선언 된 역순으로 소멸자의 }에 도달 할 때 호출됩니다. 그러면 기본 클래스 소멸자가 호출됩니다.

+0

대단한데, 클래스에 대한 내 자신의 소멸자를 작성했다면 (기본값에 의존하지 않음) 자동 제거가 발생하지 않을 것이라고 생각했습니다. 소멸자 벡터를 말하고 있습니다. – bandjalong

+1

예. 비 정적이고 포인터가 아닌 모든 멤버 개체의 경우 dtor 본문의 '}'에 도달하면 dtor가 자동으로 호출됩니다.이 멤버의 순서대로 클래스 정의에 정의되어 있습니다 (기본 클래스 dtors가 호출되면 기본 멤버가 삭제됩니다.) – dirkgently

+0

@dirkgently 수정 : 멤버는 _declaration_ – David

0

저는 DTOR을 벡터에 호출 할 필요가 없다고 생각합니다. 객체가 범위를 벗어나 자마자 DTOR가 호출됩니다. 즉, fred의 DTOR이 호출됨을 의미합니다.

0

항상 개체를 파괴하는 유일한 방법은 소멸자입니다 (반대로 여러 가지 방법으로 개체를 만들 수 있습니다). STL 컨테이너는 데이터 구조 내에서 메모리를 미세하게 관리하지 않도록 특별히 설계되었습니다. STL 컨테이너에 메모리를 명시 적으로 할당하거나 해제해야하는 경우 잘못 처리하고있는 것입니다.

관련 문제