문제

가능한 중복:
을 해제하는 방법 포인터부터 부스트::shared_ptr?

함수의 인터페이스 포인터를 반환합니다.사용자정의 소유권을 해당 개체.나는 반환하지 않으려는 활력을 불어 넣을 수 있습니다.shared_ptr 기 때문에,내가 원하지 않는 클라이언트를 사용 합니다.내부적으로 그런데,나는 저장하고 포인터에서 shared_ptr 메모리 누수를 방지하기 위해 경우에는 예외 etc.이 없는 것 같은 방법을 분리하고 포인터를 공유에서 포인터이다.어떤 아이디어요?

도움이 되었습니까?

해결책

당신이 찾고있는 것은 release 기능; shared_ptr 릴리스 기능이 없습니다. 부스트 매뉴얼에 따라:

Q. shared_ptr이 release () 함수를 제공하지 않는 이유는 무엇입니까?

A. shared_ptr은 다른 사본이 여전히 객체를 파괴하기 때문에 고유하지 않으면 소유권을 줄 수 없습니다 ().

고려하다:

shared_ptr<int> a(new int);
shared_ptr<int> b(a); // a.use_count() == b.use_count() == 2

int * p = a.release();

// Who owns p now? b will still call delete on it in its destructor.

또한, release ()에 의해 반환 된 포인터는 shared_ptr 소스가 사용자 정의 델리터로 생성 될 수 있으므로 안정적으로 거래하기가 어려울 것입니다.

고려할 수있는 두 가지 옵션 :

  • 당신은 사용할 수 있습니다 std::tr1::shared_ptr, 사용자가 TR1을 지원하는 C ++ 라이브러리 구현을 사용해야합니다. 또는 부스트를 사용하려면; 적어도 이것은 그들에게 둘 사이의 옵션을 줄 것입니다.
  • 직접 구현할 수 있습니다 boost::shared_ptr-공유 포인터와 같은 외부 인터페이스에서 사용합니다.

이 질문에서 토론을 볼 수도 있습니다. Boost 사용 :: 라이브러리의 공개 인터페이스에서 shared_ptr.

다른 팁

항상 방법이 있습니다 :-)

그들이 릴리스 () 메소드를 제공하지 않는 이유는 실제로 있지만, 하나를 만드는 것은 불가능하지 않습니다. 나만의 델리터를 만드십시오. 줄에 무언가 (실제로 코드를 컴파일하지는 않았지만 이것이 일반적인 개념입니다) :

template <typename T>
class release_deleter{
public:
  release_deleter() : released_(new some_atomic_bool(false)){}
  void release() {released_->set(true);}
  void operator()(T* ptr){if(!released_->get()) delete ptr;}
private:
  shared_ptr<some_atomic_bool> released_;
}

..

shared_ptr<some_type> ptr(new some_type, release_deleter<some_type>());

..

release_deleter<some_type>* deleter = get_deleter<release_deleter<some_type>>(ptr);
deleter->release();
some_type* released_ptr = ptr.get();

사용자는 해당 객체의 소유권을 가져야합니다. Boost.shared_ptr을 반환하고 싶지 않습니다.

shared_ptr 표현 공유 소유권, 그리고 당신은 당신의 인터페이스가 표현되기를 원합니다 옮기다 소유권의. std::auto_ptr 따라서 여기에서 더 적용 할 수 있습니다.

그러나 내부적으로 예외의 경우 메모리 누출을 방지하기 위해 공유 _ptr에 포인터를 저장하고 싶습니다.

다시, shared_ptr 그 직업에 가장 적합한 도구가 아닐 수도 있습니다. 예외의 경우 누출을 방지하려면 scoped_ptr 또는 auto_ptr 더 적합 할 것입니다.

shared_ptrscoped_ptr 리소스(shared_ptr<scoped_ptr<Resource>>).는 방법 당신은 당신을 얻 shared_ptr's 참고 믿는 것이 자동으로 파괴하는 자원하는 경우에만 여전히 붙 scoped_ptr.할 수 있지만 분리 scoped_ptr 당신이 준비되어 있을 때에 손을 떨어져의 소유입니다.

제임스가 잘 덮었으므로 공유 포인터를 분리 할 수는 없습니다.

내부적으로 여러 소유자가 필요합니까, 아니면 클래스에서 고객에게 소유권을 전송하고 있습니까? 이 경우 a std::auto_ptr 법안에 맞을 수도 있습니다.

놀라운 의미론에 대해 걱정된다면 std::auto_ptr, 당신은 그것을 내부적으로 보관할 수 있습니다 boost::scoped_ptr, 당신이 그것을 건네주는 지점에서 그것을 분리 - 클라이언트에게 맡겨 수동으로 삭제하거나 스마트 포인터에 보관하십시오.

여러분의 옆에 여러 소유자가있는 경우 침입 수를 사용할 수 있습니다. 내부적으로 사용할 수 있습니다 boost::intrusive__ptr, 그러나 인터페이스에서 원시 포인터를 끄십시오. 그런 다음 클라이언트는 수동으로 Ref Counts로 작업하거나 보관할 수 있습니다. boost::intrusive_ptr 스스로 (하지만 당신은 그것들에 의존하지 않습니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top