2009-02-02 4 views
40

나는 비슷한 것을 가지고있다 shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) Type에 대한 포인터가 필요한 C 스타일의 함수를 호출해야한다. shared_ptr에서 어떻게 알 수 있습니까? - 그렇지 않으면 불량의 원인이 될 수 있습니다 라이브러리가 수행하려고 할 수 있기 때문에,shared_ptr에서 정상 ptr을 얻으시겠습니까?

boost::shared_ptr<foo> foo_ptr(new foo()); 
foo *raw_foo = foo_ptr.get(); 
c_library_function(raw_foo); 

라이브러리 기능을 함께 수행하기 전에 shared_ptr이 범위를 벗어나하지 않습니다 있는지 확인하십시오

답변

123

get() 방법을 사용 포인터가 삭제 된 후 포인터가있는 무언가. 라이브러리 함수가 반환 한 후 원시 포인터의 복사본을 유지 관리하는 경우 특히주의해야합니다.

+0

c_library_function이 raw_foo로 작업을 수행하기 전에 shared_ptr이 범위를 벗어나는 것에 대해주의해야합니다. – falstro

+0

roe : 그것에 대해 알고, 나는 단지에 대해 알 필요가 :). 감사합니다 아담! : D –

+1

안녕하세요 @ 아담 Rosenfield,'c_library_function' 예외가 발생하는 시나리오에서 어떻게 설명 할 수 있습니다. raw_foo가 매달려 있다는 뜻입니까? 또는 foo_ptr이 raw_foo를 보유하고 있기 때문에 foo_ptr이 계속 진행되어 raw_foo를 삭제합니까? – thassan

27

&* 사업자의 조합을 사용하는 것입니다 할 수있는 또 다른 방법 : 나는 get() 방법을 사용하는 것을 선호 거라고 개인적으로 동안 (정말 정답이다)

boost::shared_ptr<foo> foo_ptr(new foo()); 
c_library_function(&*foo_ptr); 

를 하나의 장점 이것은 다른 클래스와 함께 사용할 수 있다는 점입니다 (포인터 역 참조) operator*을 오버로드하지만 get() 메소드를 제공하지 않습니다. 예를 들어, 일반적인 클래스 템플릿에서 유용 할 수 있습니다.

+0

아담스, 미안한 아담보다 조금 더 대답을 좋아했습니다. –

+3

@ acidzombie24 - 당신이 왜 더 좋아하는지 잘 모르겠습니다. 99 % 이상의 경우에 Get() 메서드를 사용하는 것이 좋습니다. –

+0

나는 get을 사용하고 있지만 여전히이 답변을 좋아합니다. 대부분 BC주의 사항은 할 일과하지 말 것을 모두 권장합니다. –

관련 문제