2012-02-28 4 views
12

제 질문은 간단하지만 어디서나 질문을 찾을 수 없었습니다.소멸자가 자동으로 호출 되나요?

나는 A의 인스턴스가 data도 제대로 파괴 얻을 것이다 파괴됩니다 같은

class A { 
    vector<int> data; 
} 

같은 클래스가, 또는 내가 data의 소멸자를 호출 A에 대한 소멸자를 작성해야하는 경우? 기본적으로 A의 인스턴스가 삭제 될 때 벡터의 동적 메모리가 해제되지 않을지 걱정했습니다. 그 대답은 data이 적절하게 해제되었다고 의심하지만, 나는 어려운 길을 잘못 알고 싶지 않습니다.

또한 A의 구조체가 A의 로컬 인스턴스가 범위를 벗어날 때 data의 소멸자를 호출하게되면?

+2

'클래스 A'선언 이후에 세미콜론이 부족합니다 (실제로 부족한 부분이므로 ...). –

답변

14

예, data은 자동으로 삭제되므로 아무 것도 수행 할 필요가 없습니다. vector은 할당 된 동적 메모리 정리를 처리합니다. 벡터의 소멸자는 A의 인스턴스가 삭제 될 때 자동으로 호출됩니다.

Aclass 또는 struct인지 여부에 관계없이 동작에 차이가 없습니다.

+14

+1 분명히하자면, "vector는 * it *에 할당 된 동적 메모리의 정리를 처리합니다. 동적으로 할당 된 객체를 벡터에 저장하는 경우 그에 따라 '삭제'해야합니다. – netcoder

+0

@netcoder 귀하의 의견을 조금 오해할만한 찾으십시오. 당신은 ** 동적으로 할당 된 객체 **에 포인터를 저장할 수 있지만, 동적으로 할당 된 "객체"자체를 저장할 수 있다고는 생각하지 않습니다. 벡터 을 선언하면 ClassA는 클래스 이름이고, vector는 보유하고있는 ClassA 객체의 파기를 처리합니다.물론, ClassA 객체가 다른 객체에 대한 포인터를 보유하고 있다면, ** ClassA는 그것들을 삭제할 책임이 있습니다 **, ** **는 벡터 책임이 아닙니다 ** 그러나 그것은 또 다른 이야기입니다. –

2

데이터 멤버의 소멸자는 항상 호출됩니다.

명시 적 소멸자 유용 수동 메모리 관리를, 당신은 일반적으로 (스마트 포인터)를 사용 RAII 컨테이너를 말하기한다 그래서 나는 개인적으로 거의가 DTORS 일 쓸 말했다

struct a{ 
    int* ip; 
    a() 
    : ip(new int(5)) 
    { } 

    ~a() { delete ip; } 
}; 

.

예외는 기본 클래스 dtor을 가상으로 선언하는 것입니다.

struct base { 
    virtual ~base() {} 
}; 
struct child : public base { 
    //base and child destructor automatically called 
} 
+0

좋은 RAII 원칙을 지키기 위해 +1. 사람들이 C++을 코딩 할 때 Stroustrup, Sutter, Meyers 및 다른 현대 C++ 사상가가 우리가 의도적으로 작성하려고하는 방식으로 소멸자를 수동으로 작성해야 할 필요가 점점 줄어들고 있습니다. – stinky472

1

자신을 정의하지 않은 경우 컴파일러에서 자동으로 default-destructor를 만듭니다. 일반적으로 포인터를 가리키는 메모리를 "소유"하는 포인터 데이터 멤버가 없거나 다른 클래스에서 파생되도록 클래스를 디자인하는 경우가 아니면 원하는 소멸자를 만들 필요가 없습니다. 최소한 비어있는 virtual 소멸자를 선언하십시오.

기본 컴파일러 생성 소멸자뿐 아니라 자신의 소멸자와 함께, 비 정적 데이터 멤버의 모든 소멸자와 현재 클래스의 모든 기본 클래스가 모두 호출됩니다. 소멸자와 소멸자 함수 자체가 반환되기 전에.

관련 문제