2013-02-01 2 views
4

적절한 방법입니까?std :: unique_ptr을 도우미 함수에 전달

void helperFunc(MyClass *ptr) 
{ 
    // do something with ptr, 
} 

unique_ptr<MyClass> p(new MyClass()); 
helperFunc(p.get()); 

또는 이러한 작업에 대해 shared_ptr을 사용해야합니까? helpFunc가 소유권을 경우

답변

5

당신은 표준 : : shared_ptr의 또는 표준을 통과 :: unique_ptr 그렇지 않으면 단지 참조로 전달합니다

void helperFunc(MyClass& my_class) 
    { 
    } 

전화 :

helperFunc(*p); 
+5

이것은 바보입니다. 함수가 소유권을 가져 오지 않으려는 경우 * 인터페이스에서도 * 소유권 * (즉 unique_ptr) * 인 이유는 무엇입니까? 소유하지 않는 참조를 가져 오는 방법은 항상 MyClass & or MyClass * 또는 const 변형을 사용하는 것입니다. * 지금 변경할 이유가 없습니다. –

+0

Seconded. 원시 포인터를 전달할 때 아무 문제가 없습니다. – Puppy

+0

원시 포인터를 사용할 수있는 유일한 문제는 스마트 포인터를 지원하는 libs와 일관되게 사용하는 libs와 이들을 사용하지 않는 라이브러리 (이전 표준을 대상으로하기 때문에)를 혼합 한 응용 프로그램을 사용하여 작업하는 경우입니다. 이 경우 소유권을 가져갈 수도 있고 가지지 않을 수도있는 비슷한 원시 포인터 함수를 사용하게 될 것입니다. [unique_ptr 사용법] (http://wp.me/p2Bia3-2U)에 대한 내 블로그 게시물보기 – TiMoch

4

당신이 get() 기능을 사용하면 원시 포인터를 가져 와서 unique_ptr 클래스를 사용하는 할당 추적을 잃게됩니다. 이 실제로 포인터의 소유권을 가져 가지 않고 일부 누락 된 참조를 남기거나 다른 상태로 남겨 둘 수 없다면 나는 get()을 사용하지 않는 것이 좋습니다.

당신이 정말로 함수에 unique_ptr 자체를 전달하는 의미 경우, 한 번 봐 걸릴 : 당신은 메모리의 소유권을 가져올하지 않는 한 How do I pass a unique_ptr argument to a constructor or a function?

+0

예, helperFunc에 "전체"소유권이 필요하지 않다고 가정합니다.하지만 그런 식으로 나는 문을 열어 몇 가지 문제를 해결합니다. 미래. – fen

+0

@fen : 예. 장래의 문제를 일으킬 가능성이 많습니다. – sheu

7

을 (이 경우 당신은 통과해야 중 하나 shared_ptr 또는 unique_ptr) 왜 포인터로 작업하는거야?

참조로 전달하십시오. 당신은 당신이 명시 적으로 nullptr들 (이 경우, 예, 원시 포인터를 사용) 허용하지 않으려면, 소유권이 여기에 일반적으로 잘하지만 불필요한 것을 원하지 않는 경우 원시 포인터를 사용

void helperFunc(MyClass& obj) 
{ 
    // do something with ptr, 
} 

unique_ptr<MyClass> p(new MyClass()); 
helperFunc(*p); 

.

관련 문제