2016-07-01 2 views
-1

트리 구조를 작성하고 트리 내의 노드를 찾기위한 기본 검색 기능을 만들었습니다. 트리 자체는 센티널 노드를 사용하여 모든 끝 (루트의 부모, 잎의 자식)을 표시하고 검색은 노드를 통해 반복하여 일치 항목을 찾거나 감시 노드에 도달 할 때까지 반복합니다. 트리의 인스턴스에서 검색 기능을 호출하면 검색 기능이 제대로 작동하지만 트리가 다른 클래스의 데이터 멤버 일 때 막히게됩니다. 다음 코드에서 "t.search (1)"은 작동하지만 "embedded_tree.t.search (1)"은 무한 루프에서 멈 춥니 다.클래스 멤버 함수가 정상적으로 작동하지만 다른 클래스의 데이터 멤버로 호출 될 때 무한 루프에 멈추다

embedded_tree.t.search() 호출이 이루어지면 "& sentinel"의 내용이 센티넬 노드를 올바르게 가리키고 있지만 새 포인터 인 것으로 나타났습니다. 그것은 root, sentinel.parent 및 sentinel.child의 내용과 동일하지 않습니다. 여기에서 나는 붙어 있고 어떻게 부르는지 모른다. & 센티넬은 트리가 만들어 질 때 생성 된 포인터와 일치한다.

#include <iostream> 

struct NODE { 
    int key; 
    NODE* parent; 
    NODE* child; 
    NODE() : key(0), parent(NULL), child(NULL) {}; 
}; 

struct TREE { 
    NODE sentinel; 
    NODE* root; 

    TREE() 
    { 
     sentinel = *new NODE; 
     sentinel.parent = &sentinel; 
     sentinel.child = &sentinel; 
     root = &sentinel; 
    } 

    NODE* search(int k) 
    { 
     NODE* x = root; 
     while (x != &sentinel) 
     { 
      if (x->key == k) return x; 
      x = x->child; 
     } 
     return &sentinel; 
    } 
}; 

struct A { 
    TREE t; 

    A() : t(*new TREE()) {}; 
}; 

int main() 
{ 
    TREE t; 
    t.search(1); 

    A embedded_tree; 
    embedded_tree.t.search(1); 
} 
+1

'sentinel = * new NODE;'는 좋지 않습니다. – alain

+2

't (* new TREE())'- 왜 이러는거야? 포인터에 할당하고 필요하지 않으면 사용하지 않는 한'new'를 사용하지 않습니다. (힌트 : 여기서는 필요 없으며 메모리 누수가 발생합니다.) –

+0

'embedded_tree.t.search (1);'함수 호출을 추적 할 때 디버거에서 알려주는 것은 무엇입니까? –

답변

0

동적 할당과 스택 할당이 혼동 스럽습니다. 당신이 할 때

sentinel = *new NODE 

나쁜 일이 일어난다. 스택에 NODE sentinel에 대해 메모리가 할당 된 다음 의 연산자가 new 인 경우 할당이 sentinel 변수로 완료되고 new 연산자에 생성 된 메모리가 손실됩니다. 대신 포인터를 사용하도록 코드를 다시 작성, 우리는 C++에 대해 얘기하고 있기 때문에, 당신이 익숙해 후 스마트 포인터와 컨테이너에보고 당신을 건의 할 것, 그러나이

#include <iostream> 

struct NODE { 
    int key; 
    NODE* parent; 
    NODE* child; 
    NODE() : key(0), parent(NULL), child(NULL) {}; 
}; 

struct TREE { 
    NODE* sentinel; 
    NODE* root; 

    TREE() 
    { 
     sentinel = new NODE; 
     sentinel->parent = sentinel; 
     sentinel->child = sentinel; 
     root = sentinel; 
    } 

    ~TREE() { 
     if (NULL != sentinel) { 
      delete sentinel; 
      sentinel = NULL; 
      root = NULL; 
     } 
    } 

    NODE* search(int k) 
    { 
     NODE* x = root; 
     while (x != sentinel) 
     { 
      if (x->key == k) return x; 
      x = x->child; 
     } 
     return sentinel; 
    } 


}; 

struct A { 
    TREE* t; 

    A() : t(new TREE()) {}; 
    ~A() { 
     if (NULL != t) { 
      delete t; 
      t = NULL; 
     } 

    } 
}; 

int main() 
{ 
    TREE t; 
    t.search(1); 

    A embedded_tree; 
    embedded_tree.t->search(1); 
} 

처럼 뭔가를 소멸자를 추가해야 수동 메모리 관리.