2012-08-15 3 views
2

auto_ptr을 NULL 또는 이와 동등한 것으로 설정하는 방법이 있습니까? 예를 들어, 내가 진 노드 객체로 구성된 트리 만드는거야 :auto_ptr을 NULL로 설정하는 방법

auto_ptr<Node> n(new Node); 
(*n).set_node(i->second, i->first, NULL, NULL); 

이 오류가 발생합니다 : 부모 노드가 아닌 노드에 대해

struct Node { 
    int weight; 
    char litteral; 
    auto_ptr<Node> childL; 
    auto_ptr<Node> childR; 
    void set_node(int w, char l, auto_ptr<Node> L, auto_ptr<Node> R){ 
     weight = w; 
     litteral = l; 
     childL = L; 
     childR = R; 
    } 
}; 

을, 나는이 일을 계획했다 . 그것을 NULL로 설정하는 방법이 있습니까? 아니면 이해할 수있는 또 다른 조치가 있습니까?

답변

6

실수로 소유권을 std::auto_ptr으로 옮기는 것을 방지하기 위해 포인터를 사용하는 std::auto_ptr 생성자가 명시 적입니다. 당신은 두 가지 기본 - 건설 std::auto_ptr 객체에 전달할 수 있습니다

(*n).set_node(i->second, i->first, std::auto_ptr<Node>(), std::auto_ptr<Node>()); 

당신이 대상으로하는 표준 라이브러리 구현 std::unique_ptr을 포함하는 경우

은 대신 사용하는 것이 좋습니다. 문제가되는 복사 의미가 std::auto_ptr이 아니므로 std::auto_ptr은 더 이상 사용되지 않으며 std::unique_ptr으로 대체되었습니다.

std::unique_ptr에는 null 포인터 상수로부터 암시 적 변환을 허용하는 변환 생성자가 있으므로 NULL을 전달하는 코드는 std::unique_ptr을 사용하는 경우 올바르게 작동합니다.

+0

감사합니다. 지금부터는 unique_ptr을 사용하겠습니다. set_node에 실제 auto_ptr을 전달하면 childL & chilR에 대한 소유권이 부여됩니까? –

+0

예, 'auto_ptr'을 "복사"하면 "이전"의 auto_ptr이 소유권을 잃고 (null로 재설정 됨) "새로운"auto_ptr이 소유권을 얻습니다. –

2

컴파일러 도구 집합 (예 : Visual C++ 10/11, Gcc 4.5 이상)을 사용하거나 boost :: scoped_ptr (Visual C++ 9 또는 이전 버전을 사용하는 경우)을 사용하는 경우 std :: unique_ptr로 전환하는 것이 좋습니다. boost의 최근 버전)을 사용하여 std :: auto_ptr을 사용하여 의미 론적 문제를 근본적으로 복사하는 것을 피할 수 있습니다.

참고 : std :: unique_ptr은 컴파일러 선택에 대한 추가 요구 사항을 부과하는 C++ 11 기능입니다.

관련 문제