2014-01-09 2 views
0

이 클래스의 소멸자에서 을 삭제해야합니까? 노드에이 소멸자에서 delete를 호출 했습니까?

  1. 2 포인터 : 노드에 대한 포인터의

    class Node { 
    private: 
        char Ch; 
        int Key; 
        Node* L; 
        Node* R; 
    public: 
        Node() { L = NULL; R = NULL; } 
        Node(char, int, Node*, Node*); 
        ~Node(); 
    }; 
    
  2. 벡터 : 나는 "새로운"을 통해 노드를 할당 내 프로젝트의 다른 클래스에서

    class Example { 
    private: 
        vector<Node*> A; 
    public: 
        Node() {} 
        Node(vector<Node*>); 
        ~Node(); 
    }; 
    

!

+2

삭제에 대해 걱정할 필요가 없습니다. 당신이 게시 한 코드에서 알 수 없습니다. – juanchopanza

+1

"new"에 대한 호출이 표시되지 않습니다. – PaulMcKenzie

+0

'Example'의 멤버 함수는'Node'가 아니라'Example'이어야합니다. ... 그리고 Stackoverflow는 다른 사람들이 당신의 일을하는 것에 관한 것이 아닙니다 : 당신은 무엇을 시도 했습니까? –

답변

0

new을 사용하여 노드를 할당하면 노드를 삭제해야합니다. 예 : vector는 그것들을 지우지 않고 벡터 자체를 지우지 만 요소가 가리키는 포인터는 지우지 않습니다 (포인터의 벡터를 가지고 있기 때문에). 클래스의 소유권을 알 수 있듯이 노드의 소유권은 약간 까다 롭습니다. 어떤 클래스를 삭제해야합니까? 그래서 shared_ptr<>unique_ptr<>과 같은 스마트 포인터를 사용하면 훨씬 쉬워집니다.

예컨대

std::shared_ptr<Node> L; 
std::shared_ptr<Node> R; 

std::vector<std::shared_ptr<Node>> A; 

는 당신은 상황에 따라 다르다

+0

감사합니다. 다른 질문이 있습니다. 이진 트리가 있고 간단한 포인터를 사용하려면 클래스 노드에서 노드에 대한 포인터 인 왼쪽 및 오른쪽 자식에 대한 소멸자에서 delete를 호출해야합니다. 이런 식으로, 소멸자가 호출 될 때, 자식이 아니고 노드에 대한 포인터 인 루트는 삭제되지 않을 것입니다. 사실입니까? 루트에 대해서도 다른 삭제를 호출해야합니까? – Maghio

+0

IMHO : 이것은 재귀적인 문제처럼 느껴지므로 노드 내부를 삭제하는 대신 잎에서 트리 삭제를 반복적으로 통과하는 정리 기능이 필요합니다. 노드 내부를 삭제하는 경우 각 노드가 트리에있는 노드를 인식하도록해야합니다. 나는 뿌리깊 은가? 앞으로는 트리를 재구성하려고 할 때 노드를 이동하는 것이 더 번거로울 것입니다. –