2017-10-18 4 views
3

각 노드에 자식 노드에 대한 포인터 만있는 이진 트리가 있으면 unique_ptr이 잘 작동합니다. 각 노드가 부모 포인터를 갖기를 원한다면, 노드가 가리키는 세 개의 포인터가있을 수 있으므로 상황이 좋지 않습니다. Binary Tree with parent pointer이진 트리에 대한 스마트 포인터

이 경우 어떻게해야합니까? 모든 것에 대해 shared_ptr을 사용할 수는 있지만 사이클을 얻을 수 있기 때문에 좋은 디자인이 아니라고 들었습니다. 부모 포인터로 weak_ptr을 사용한다면, shared_ptr이 무엇입니까? weak_ptr을 만드시겠습니까?

일반 내장 포인터가이 문제에 더 적합 할 수 있다고 생각하기 시작했습니다. 어떤 조언을 크게 주시면 감사하겠습니다.

+11

'std :: unique_ptr'과 부모에 대한 소유하지 않은 ** 원시 포인터의 쌍에는 아무런 문제가 없습니다. – StoryTeller

+7

대부분의 경우 스마트 포인터는 간단한 자체 삭제 포인터가 아니라 소유 프리미티브로 사용되어야합니다."자원"은 단 하나의 소유자 ('std :: unique_ptr') 또는 복수의 동시 소유자 ('std :: shared_ptr' 포함)를 가질 수 있습니까? –

+0

어쩌면 여기에 혼자가 있지만 btree 구현에서 스마트 포인터를 사용하는 것이 가장 좋습니다. 당신이 제어 할 수있는 구체적인 클래스 내에서 원시 포인터를 사용할 때 아무런 문제가 없다. 또한 "주인이되는 것"이라는 개념은 나무에 묶여있는 하나 이상의 "직관적 인"견해가 있습니다. 나중에 그래프 작업을 구현하고 싶다면 아마도 엉망이 될 것입니다. –

답변

4

나는 각 노드는 단지 다음 아이 노드, unique_ptr 작품에 대한 포인터 아주 잘가 포함 이진 트리가있는 경우.

오른쪽. 내가 부모 포인터를 가지고 각 노드를 원하는 경우에 노드가 세 포인터가 을 소유 사이에

당신은 구별해야 포인터를 가리키는 가질 수 있기 때문에

는 다음 상황은 너무 좋은하지 않습니다 포인터 및 관찰 포인터.

원시 포인터를 소유하고있는 것은 나쁜 생각 버그 누출의 근원이다; 한편, 을 관찰하면 포인터가 많은 경우에 (관찰 된 객체가 여전히 "라이브"인 동안) 괜찮을 수 있습니다. 이러한 포인터를 소유,이 경우에서 잘 unique_ptr 작품 같은 스마트 소유 포인터를 사용하는 귀하의 경우

, 당신은 각 노드가 자식 노드에 unique_ptr의를 포함하는 디자인을 고려하는 것이 좋습니다.

는 한편, 아이 노드가 비 소유 포인터를 사용하여 자신의 부모를 참조 할 수 있습니다, (아이들은 , 아이들이 단지 부모를 관찰 노드들이 부모 "를 보유하고 있지 않습니다") 포인터는 을 소유하지 않아서 올바르게 작동합니다 ( 포인터). 당신이 사용하는 경우 shared_ptr 당신은 당신이 제대로 휴식을하지 않는 것처럼, 주기에주의를 지불해야/보조 노트로서

는, 당신은 누출 (출시되지 않은 객체)가 있습니다. 반면에, 부모가 unique_ptr을 소유하여 어린이를 가리키고 있고, 자식 이 원시 관찰 포인터를 통해 부모를 관찰하는 것은 나에게 더 단순한 디자인처럼 보입니다.

+0

감사합니다. 나는 내장 포인터가 항상 좋지 않다고 생각했다. (함수 포인터를 제외하고). 그러나 포인터를 소유하고 관찰하는 것을 생각하는 것이 훨씬 더 합리적입니다. 관찰을 위해 약한 포인터와 내장 (멍청한) 포인터를 사용해야합니다. 소유를위한 고유하고 공유 된 포인터. 고마워,이게 내게 훨씬 더 분명해. – RonnyZed

+0

@RonnyZed 안녕하세요. 내가 도움이 된 것을 기쁘게 생각한다. –