2012-02-24 3 views
2

포인터가 가리키는 개체가 해제되는 것을 방지하는 데 문제가 있습니다. 나는 이것이 문제라고 생각하지만 그것을 해결하는 방법을 모른다.포인터가 아무 것도 가리 키지 않도록 방지

내 코드 :

enum TOKEN_TYPE { 
    OPEN, CLOSE, TEXT 
}; 

struct Token { 
    int type; 
    std::string value; 
}; 

typedef std::vector<Token>::iterator token_it; 

Tree::Tree(token_it start) {  
    root.value = start->value; 
    createNode(++start, &root); 
} 

void Tree::createNode(token_it it, Node* parent) { 
    Node current; 

    current.value = it->value; 
    current.parent = parent; 

    if(parent != 0) { 
     parent->children.push_back(&current); 
    } 

    ++it; 
    while(it->type != TOKEN_TYPE::CLOSE && it->value != current.value) { 
     if(it->type == TOKEN_TYPE::OPEN) { 
      createNode(it, &current); 
     } 

     ++it; 
    } 
} 

나는 프로그램이 가비지 콜렉션이 parent 아무것도를 가리키는 잎 current 비우는 createNode 통화를 종료하기 시작 말까지 모든 것이 완벽 프로그램을 통해 스테핑 시도; 적어도 그것이 내가 생각하는 것입니다.

+0

C++는 기본적으로 가비지 컬렉터가 없습니다. 코드는 당신이 생각하는대로 확실히 일어나지 않습니다. 사람들이 코드에 무엇이 잘못되었는지를 빨리 알기를 원한다면 컴파일 된 것을 제공해야합니다. 그래서 우리는 스스로 시도해 볼 수 있습니다. –

+6

수정 : 명시 적으로 그렇게하지 않는 한 _explicitly allocated_는 삭제되지 않습니다. 여기서 문제는 '현재'가 스택에 있고 범위를 벗어나면 파괴된다는 것입니다. – Chowlett

+0

그렇다면'Node'의 소멸자가 호출되지 않으면 왜 호출되고 있습니까? (Chowlett ninja said) – Lerp

답변

3

먼저 C++에서 가비지 콜렉션이 없습니다.

void Tree::createNode(token_it it, SmartPtr<Node> parent) 

셋째, 당신의 가정이 맞다 :

{ 
    Node current; 
    parent->children.push_back(&current); 
} //current is destroyed here 

current자동 스토리지에 할당되어 있기 때문에이 문제가 발생 번째

대신 원시 포인터 스마트 포인터를 사용합니다. 당신이 parent 내부 메모리를 관리하는 경우

, 동적 현재 노드 를 만들 수 있습니다

{ 
    Node* current = new Node; 
    parent->children.push_back(current); 
} 
+0

A) 가비지 수집이 더 이상 사용되지 않는 메모리의 자동 해제라고 생각 했습니까? 범위를 벗어나는 객체를 자동으로 삭제할 때 다른 점이 있습니까? B)'new Node'를 사용하면 Tree의 소멸자 안에있는 모든 노드를 삭제해야합니다. – Lerp

+0

@Rarge : 자동 객체는 프로그램의 나머지 부분이 참조를 가지고 있는지 여부에 관계없이 범위를 벗어날 때 항상 파괴됩니다. 가비지 수집 객체는 사용 가능한 참조가있는 한 계속 살아 있습니다. –

+0

@Rarge B) 예, 당신이 내 조언을하고 원시 포인터 대신 스마트 포인터를 사용하지 않는 한. –

관련 문제