문제

나는 많은 것을 가지고 있다 boost::shared_ptr<MyClass> 그리고 어느 시점에는 의도적으로 delete 그 중 일부는 메모리를 확보하기 위한 것입니다.(그 시점에서 나는 가리키는 것이 결코 필요하지 않을 것이라는 것을 알고 있습니다. MyClass 더 이상 개체가 없습니다.) 어떻게 해야 합니까?

그냥 전화하면 안될 것 같아 delete() 내가 얻는 원시 포인터로 get().

기능을 본 적이 있어요 get_deleter(shared_ptr<T> const & p) ~에 boost::shared_ptr, 하지만 어떻게 사용하는지 잘 모르겠고, 또한 다음과 같이 말합니다. 실험적인 바로 옆에 있어요.(부스트 1.38이 있는 것 같습니다.)

어쩌면 새로운 빈 공간을 할당할 수도 있습니다. boost::shared_ptr 변수에?이전 값을 버리고 삭제해야 합니다.

도움이 되었습니까?

해결책

당신은 그냥합니다

ptr.reset();

참조 shared_ptr 매뉴얼. 그것은 동일합니다

shared_ptr<T>().swap(ptr)

당신은 전화합니다 reset 더 이상 객체를 참조해서는 안되는 모든 스마트 포인터에서. 마지막 reset (또는 참조 수가 실제로 0으로 떨어지는 다른 조치)는 객체를 Deleter를 자동으로 사용하여 자유롭게합니다.

어쩌면 당신은 관심이 있습니다 스마트 포인터 프로그래밍 기술. 그것은 항목이 있습니다 지연된 거래.

다른 팁

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

전체 요점은 boost::shared_ptr<T> pointee 개체가 삭제된다는 것입니다 정확히 아닌 순간에 shared_ptr<T>그것을 가리키고 있습니다. 즉, 마지막 shared_ptr<T> 이 객체를 가리키는 것은 범위를 벗어나거나 다른 객체를 가리키도록 재할당됩니다.따라서 개체를 삭제하기 위해 해야 할 일은 개체가 없는지 확인하는 것입니다. shared_ptr<T>그것을 가리키고 있어요.예:너 하나만 갖고 있다면 shared_ptr<T> ~라고 불리는 p 개체를 가리키거나 범위를 벗어나도록 하거나 호출 p.reset() (동등 p = NULL 일반 포인터의 경우) 또는 다른 것을 가리키도록 할당하세요.

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

편집하다: 지적해주신 dehmann에게 감사드립니다. p = NULL; 실제로는 유효한 코드가 아닙니다. shared_ptr<T>... :)

당신이하고 싶은 것은 사용하는 약한 참조를 반환하는 것입니다. 부스트 :: 약한 _ptr 필요할 때 Shared_ptr로 변환 할 수 있습니다. 이를 통해 shared_ptr에서 객체의 수명을 제어 할 수 있으며 액세스하려는 사람들은 약한 _ptr을 유지하고 shared_ptr로 변환 할 수 있습니다. 그 변환이 실패하면, 그들은 물체를 다시 메모리로 가져올 수 있습니다.

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