2009-03-07 3 views
43

나는 많은 boost::shared_ptr<MyClass> 개체를 가지고 있으며 어떤 점에서는 의도적으로 일부 메모리를 해제하기 위해 일부는 delete에 있습니다. (나는 그 시점에서 더 이상 객체가 필요 없다는 것을 안다.) 어떻게해야합니까?boost :: shared_ptr을 고의로 삭제하는 방법?

delete()get()의 원시 포인터와 함께 호출 할 수는 없을 것입니다.

나는 함수 boost::shared_ptr에서 get_deleter(shared_ptr<T> const & p) 본 적이 있지만 나는 그것을 사용하는 방법을 잘 모르겠어요, 또한 그것이 바로 옆에 실험을 말한다. (내가 부스트 1.38 있다고 생각합니다.)

그냥 새 변수 boost::shared_ptr 변수에 할당할까요? 그러면 이전 값을 버리고 삭제해야합니다.

+15

NOOOOO : get() 호출 후 delete를 호출하지 마십시오. 스마트 포인터는 여전히 사본을 가지고 있으며 객체를 해제 할 때 delete를 호출합니다. –

답변

80

당신은

ptr.reset(); 

shared_ptr manual를 참조 할. 그것은 당신이 더 이상 객체를 참조해서는 안 모든 스마트 포인터에 reset 전화

shared_ptr<T>().swap(ptr) 

에 해당합니다. 마지막으로 reset (또는 참조 횟수가 0이되도록하는 다른 작업) 실제로는 deleter를 사용하여 개체를 자유롭게 만듭니다.

어쩌면 당신은 Smart Pointer Programming Techniques에 관심이있을 것입니다. 그것은 delayed deallocation에 대한 항목이 있습니다.

8

boost::shared_ptr<T>의 요점은 pointee 객체가 없음 shared_ptr<T>의 포인트는 순간에 정확히을 삭제하는 것입니다 - 즉, 마지막 shared_ptr<T>이 객체 가리키는 때하는 범위를 벗어나거나 재 할당한다 다른 객체를 가리 키기 위해서. 따라서 개체를 삭제하기 위해서해야 할 일은 shared_ptr<T>이 가리키는 것을 확인하는 것입니다. 예 : 하나의 개체가 p 인 개체를 가리키는 단일 shared_ptr<T> 만있는 경우 해당 개체가 범위를 벗어나게하거나 p.reset() (일반 포인터는 p = NULL과 동일)을 호출하거나 다른 개체를 가리 키도록 할당하십시오.

개체를 가리키는 두 개의 shared_ptr<T>이 있으면 두 개체를 모두 다시 할당해야합니다.

편집 : 감사 p = NULL;shared_ptr<T>에 실제로 유효한 코드가 아니라고 지적 dehmann하는 ... 당신이 원하는 무엇

+3

좋은데, 한가지 : p는 shared_ptr이지 포인터가 아니기 때문에 p = NULL을 쓸 수 없습니다. – Frank

+1

예, shared_ptrs를 사용할 때 NULL을 사용하는 방법에 관한 관련 질문은 http://stackoverflow.com/questions/621220/null-pointer-with-boostsharedptr/621249#621249 –

+1

@dehmann : 절대적으로 오른쪽 ... –

4

:)는로 변환 할 수 있습니다 boost::weak_ptr를 사용하여 약한 참조를 반환 할 것입니다 필요한 경우 shared_ptr. 이렇게하면 shared_ptr에서 객체의 수명을 제어 할 수 있으며 액세스하려는 객체는 weak_ptr을 유지하고 shared_ptr로 변환하려고 시도 할 수 있습니다. 변환에 실패하면 다시 쿼리하여 객체를 다시 메모리로 가져올 수 있습니다.

9

개체를 의도적으로 삭제할 수있게하려면 (나는 항상 그렇습니다) 단일 소유권을 사용해야합니다. 자신의 디자인에 적합하지 않을 때 shared_ptr을 사용하게되었습니다.

관련 문제