2013-06-15 4 views
9

나는 수동으로 참조 카운트 된 구조체를 많이 사용하는 C++로 포팅하는 C 라이브러리가있다. 나는 참조 카운팅을 자동으로 처리하기 위해 shared_ptr을 사용하는 것으로 생각했지만, C API를 유지하기를 원한다.C 인터페이스에서 shared_ptr 사용?

Object* object_create(void); 
Object* object_retain(Object* o); 
void object_release(Object* o); 

내가 shared_ptr를 사용하는 경우, 효과적으로 C API의 사용 설명서 참조 카운팅을 노출 할 수있는 방법이있다 : 오래된 서명은 다음과 같을?

+1

명확히하기 위해; 당신은 shared_ptr이'object_create'에서 얻은 미처리 포인터를 감싸고, 해당 시점에'object_release'를 호출하게할까요? –

+0

@OliCharlesworth 아니요, C++에서'Object'를 클래스 대신 (구조체 대신) 사용하고 있으며 C++ 코드에서'shared_ptr'을 사용하고 있습니다. 내가 shared_ptr에서 원시 포인터를 얻을 수 있다면 그것은 어쨌든 여전히 shared_ptr의 refcount와 함께 작동하게하는 것이 흥미 롭습니다. –

+2

[Boost.intrusive_ptr] (http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/intrusive_ptr.html)을 사용하는 것이 더 나을 수도 있습니다. – Angew

답변

5

shared_ptr의 문제점은 이미 알아 냈으므로 인스턴스를 구성하거나 파기하는 것 외에는 참조 수를 수정할 수 없다는 것입니다. 따라서 참조 횟수가 0이 될 때까지 Object 주위에 각각 shared_ptr을 유지하는 것 이외에는이 방법을 사용할 수 없습니다.하지만이 작업을 수행하면 참조 횟수를 재실행해야하므로 거의 효과가 없습니다.

아마도 boost::intrusive_ptr이 더 좋은 옵션입니다.

1

std::shared_ptr::get을 사용하여 object_create에서 포인터 값을 검색 할 수 있습니다.

object_retain 또는 object_release은 이미 shared_ptr에 의해 자동으로 처리되므로 잘 유지해야할지 모르겠습니다.

C 코드로 라이브러리를 사용 하시겠습니까? 그렇다면 @Angew가 그의 코멘트에서 지적한 바와 같이, Boost.intrusive_ptr를 살펴보면, 그것은 최선의 선택 인 것으로 보인다.

C로 작성된 클라이언트 코드가 C 라이브러리를 사용한다고 가정 할 수 있다면,이 함수를 완전히 삭제하고 내부적으로 모두 처리 할 수 ​​있습니다. 필요한 경우 C api와의 호환성을위한 원시 포인터를 제공 할 수 있지만 모든 평생 관리는 shared_ptr을 사용하여 자동으로 처리 할 수 ​​있습니다.

+0

참조 수는 C 측에서 자동으로 유지되지 않습니다. 'Object'에 대한 마지막'shared_ptr'이 파괴되었지만 여전히 그것을 가리키는'Object *'가 있다면, 그 객체는 파괴되고 C 포인터는 매달려 있습니다. –

+0

사실,'shared_ptr'이 객체의 수명을 처리한다고 가정 할 때 객체의 뷰어로 사용되는 원시 포인터를 생각하고있었습니다. – Uflex

관련 문제