2010-12-29 6 views
4

스마트 포인터로 코드를 다시 작성하고 있습니다. 스마트 포인터 질문

void Foo(SomeClass *p) { } 
boost::shared_ptr<SomeClass> p(new SomeClass); 

지금 무엇을 : 래퍼 ( p.get())에서 원래의 포인터를 전달하거나 함수 인수를 재 작성과 같은 직접 스마트 포인터를 전달 :

void Foo(boost::shared_ptr<Foo> obj) { } 

잘 모르겠어요 나는 이러한 상황이있다. 스마트 포인터는 포인터를 따라야하며 프로그램에서 여전히 필요한지 여부를 알아야합니다. 그래서 우리는 원래 포인터를 전달할 수 있습니다.

답변

5

Foo이 (공유) *p의 소유권을 가져야하는 경우가 아니면 서명을 동일하게 유지하고 단지 p.get()을 전달해야합니다. 가장 단순하고 유연한 옵션 일뿐만 아니라 기존 코드를 최소한으로 변경해야합니다.

+2

단점은 tyou가 Foo''의 일반 포인터 아주 확실하게해야한다는 것입니다 다른 스마트 포인터의 통제하에 있지 않습니다. 현재도 아니며 나중에 유지 관리 업데이트 중에도 없습니다. –

+1

@ Bart van Ingen Schenau : 그것은 상당히 과격한 디자인 변경을 의미합니다. 'Foo'가 매개 변수의 소유권을 얻는 시점에서, 매개 변수 유형이 서명에서이를 적절히 표현하기 위해 검토 될 필요가있는 시간입니다. –

0

함수가 포인터 p를 사용하여 SomeClass 객체를 조작하거나 읽는 경우 p.get()을 사용할 수 있습니다. 포인터 p가 다른 포인터 변수 또는 이와 유사한 것에 할당되어 있으면 함수의 서명을 변경해야합니다.

3

이미 스마트 포인터를 사용하도록 코드를 다시 작성한 경우 가능한 모든 곳으로 가서 일반/원시 포인터를 제거해야합니다.

스마트 포인터는 가비지 컬렉터처럼 내용을 추적하기 위해 마술을 사용하지 않지만 통제 대상이 해제되어야하는지 여부를 결정하기 위해 다소 단순한 경험적 방법을 사용합니다. 스마트 포인터를 잘못 사용하면이 경험적 방법을 쉽게 깨뜨릴 수 있습니다.

예를 들어, shared_ptr은 (복사본에서 직접 또는 간접적으로 만들어지는) 모든 복사본을 추적하고 마지막 복사본이 삭제 될 때 제어 된 개체를 파괴합니다. 두 개체가 모두 같은 개체를 제어하지만 하나가 다른 개체의 복사본이 아닌 경우 두 개의 shared_ptr을 만드는 경우이 작업은 끔찍한 일입니다.

2

Foo의 매개 변수는 null이됩니까? 대답이 아니오 인 경우에, 당신은 정말 대신 포인터의 참조를 사용한다 :

void Foo(SomeClass &obj) { } 

사용법 :

boost::shared_ptr<SomeClass> obj(new SomeClass); 
Foo(*obj);