문제

나는 C ++에서 이진 트리를 구현하는 과정에 있습니다. 전통적으로, 나는 왼쪽에 대한 포인터와 오른쪽에 대한 포인터를 가지고 있지만 수동 메모리 관리는 일반적으로 눈물로 끝납니다. 내 질문으로 이어집니다 ...

데이터 구조는 shared_ptr을 사용할 수있는 적절한 장소입니까?

도움이 되었습니까?

해결책

나는 그것이 당신이 그들을 어디에 사용하고 있는지에 달려 있다고 생각합니다. 나는 당신이 생각하는 것이 다음과 같은 것이라고 가정합니다.

template <class T>
class BinaryTreeNode 
{
    //public interface ignored for this example
    private:
        shared_ptr<BinaryTreeNode<T> > left;
        shared_ptr<BinaryTreeNode<T> > right;
        T data;
}

이것은 완벽하게 이해 될 것입니다 만약에 데이터 구조가 동적으로 생성 된 노드를 처리 할 것으로 기대합니다. 그러나 그것은 일반적인 디자인이 아니기 때문에 부적절하다고 생각합니다.

Shared_ptr의 사용은 객체가 실제로 공유되었음을 암시하지만 이진 트리의 노드는 다음과 같습니다. ~ 아니다 공유. 그러나 Martin York이 지적했듯이, 왜 바퀴를 재창조 하는가 - 이미 우리가하려는 일을하는 스마트 포인터 유형이 있습니다 -Auto_ptr. 그러니 다음과 같은 것을 가지고 가십시오.

template <class T>
class BinaryTreeNode 
{
    //public interface ignored for this example
    private:
        auto_ptr<BinaryTreeNode<T> > left;
        auto_ptr<BinaryTreeNode<T> > right;
        T data;
}

누구든지 데이터가 Shared_ptr이 아닌 이유를 묻는 경우 답은 간단합니다. 데이터의 사본이 고객 라이브러리의 경우 데이터 항목을 전달하고 트리 노드가 사본을 만듭니다. 만약 고객 사본이 나쁜 생각이라고 결정한 다음 고객 코드는 트리 노드가 안전하게 복사 할 수있는 shared_ptr로 전달 될 수 있습니다.

다른 팁

왼쪽과 오른쪽은 공유되지 않기 때문에 :: shared_ptr <>은 아마도 올바른 스마트 포인터가 아닐 것입니다.

이것은 std :: auto_ptr <>를 시도하기에 좋은 곳입니다.

네 그럼요.

그러나 원형 데이터 구조가 있으면주의하십시오. 서로 공유 된 PTR이있는 두 개의 객체가있는 경우 공유 PTR을 수동으로 지우지 않으면 서 절대로 해방되지 않습니다. 이 경우 약한 PTR이 사용될 수 있습니다. 물론 이것은 이진 트리에 대한 걱정이 아닙니다.

각 객체에 단일 소유자가있는 행복한 경우에는 메모리 관리를 수동으로 작성하는 것이 어렵지 않습니다. 따라서 소멸자에서 소유 한 것을 삭제할 수 있습니다.

정의에 따른 나무가 각각 단일 부모가있는 노드로 구성되므로 단일 소유자에게 명백한 후보자가되기 때문에 이것은 행복한 행사 일뿐입니다. 축하합니다!

나는 그것이 당신의 경우에 그러한 솔루션을 개발하고, 또한 shared_ptr 접근, 동일한 인터페이스 뒤에 차이를 완전히 숨기므로 둘 사이를 전환하고 성능 차이를 현실적인 실험과 비교합니다. 그것은 그것이 아는 유일한 확실한 방법입니다 shared_ptr 응용 프로그램에 적합합니다.

(* 우리를 위해, 당신이 어떻게 진행되는지 말해주십시오.)

데이터 구조의 노드에 shared_ptr을 사용하지 마십시오. 소유권이 공유 된 경우 노드의 파괴를 일시 중단 또는 지연시킬 수 있습니다. 이로 인해 파괴자가 잘못된 순서로 호출 될 수 있습니다. 노드의 생성자가 다른 노드와 커플하는 코드를 포함하고 다른 노드에서 제거하는 코드를 포함하도록 데이터 구조의 모범 사례입니다. 잘못된 순서로 호출 된 소멸자는이 디자인을 깨뜨릴 수 있습니다.

Shared_PTR, 특히 공간 요구 사항에는 약간의 추가 오버 헤드가 있지만 요소가 개별적으로 할당되면 Shared_ptr은 완벽합니다.

포인터조차 필요합니까? 당신이 사용할 수있는 것 같습니다 boost::optional<BinaryTreeNode<T> > left, right.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top