2014-10-31 2 views
-2

나는 다음과 같은 코드를 가지고 :필드의 수퍼 클래스 호출 소멸자를 삭제합니까?

template<class T> 
class List<T> { 
    class Node{ 
     T data; 
     Node * next; 
     ... 
    }; 
    Node * head; 
    ... 
    ~List() {/*iterating through all nodes and deleting them*/} 
    ... 
}; 

template<class T> 
class Tree<T> { 
    class Node { 
     Node * next; 
     ... 
     T key; 
     List<int> internal_list; 
    }; 
    destroy_node(Node * x) { delete x; } 
}; 

destroy_node(Node * x) 호출 List<T> 클래스의 소멸자를합니까 아니면 명시 적으로 호출해야합니까?

+0

중첩 된 클래스로 두 번 노드가 있기 때문에 약간 혼란 스럽습니다. 트리 삭제 :: Node는 Tree :: Node :: internal_list의 소멸자를 호출합니다. –

답변

5

예.

클래스의 소멸자는 항상 모든 하위 오브젝트의 소멸자를 구성의 역순으로 호출합니다.

가상 기본 클래스, 정상 기본 클래스 또는 위의 구성원 하위 개체가 있는지 여부는 중요하지 않습니다.

(virtual베이스 클래스는 항상 건설하고 결코베이스 클래스에서 가장 파생 클래스에서 직접 파괴.
을 그리고 당신은 어느 쪽의 포인터를 통해 가장 파생 유형을 객체를 파괴하는 경우도 소유하고 있습니다 a virtual dtor, 모든 베팅은 해제됩니다.)

+0

흠 .. 누군가가 "항상"오해하고 "delete foo"가 마술처럼 모든 것을 할 것이라고 생각할 수 있기 때문에 가상에 대해 조금 더 말하면 어떨까요? 내 말은, 비 가상 소멸자는 제대로 처리하지 않으면 몇 가지를 생략 할 수 있기 때문에 99.5 %와 같이 항상 "100 %"가 아님을 의미합니다. – quetzalcoatl

+0

@quetzalcoatl : 이러한 추가 문제를 해결하기 위해 두 문장을 추가했습니다. – Deduplicator

0

클래스가 소멸되면 포인터가 아닌 모든 멤버의 소멸자가 자동으로 호출됩니다. new/new[]으로 동적으로 할당 된 객체에 대한 포인터 인 멤버 또는 메모리 함수로 동적으로 할당 된 메모리 블록은 각각 delete/delete[] 또는 적절한 메모리 함수를 사용하여 직접 해제해야합니다.

예,이 예에서 Node 인스턴스를 삭제하면 internal_list 회원이 자동으로 파괴됩니다.

+3

소멸자 모든 서브 메 소드의 소멸자를 커스텀 클래스인지 아닌지를 호출합니다. –

+0

답변을 수정했습니다. –

+2

클래스의 멤버가 "자동"인지 아닌지는 잘못되었습니다. –

관련 문제