C++shared_ptr 대에 대한 포인터를 저장을 위한 리소스 관리
-
21-12-2019 - |
문제
나는 궁리의 사용 unique_ptr
대 shared_ptr
대 own_solution
.나는 할인가로 후반으로 난 것이 거의 확실히 잘못하고 있어요,하지만 문제 unique_ptr
고 shared_ptr
에서는 어느 쪽도 캡처 정확하게 내가 무엇을 원합니다.게 만들려는 리소스 관리자는 명시적으로 소유하는 리소스,그러나 나는 다음과 같이 리소스 관리자는 또한 참조 자원입니다.
내가 사용하는 경우 unique_ptr
리소스 관리자는 손으로 원 포인터가 가능성이 그들은 다른 곳에서 탈출 할 수 있(지만 이 것에 대해 클래"계약"나).내가 사용하는 경우 shared_ptr
고 weak_ptr
, 아무것도 없 중지에서 발신자 변환 weak_ptr
을 shared_ptr
고 저장하는함으로써 잠재적으로 만들 사이클 또는 악화,자원활 수명을 넘어 리소스의 관리자입니다.그래서 가정이 무엇 내가 찾는 것은 deferencable weak_ptr
할 수 없으로 변환 shared_ptr
.
또는 난 그냥을 찾을 적용하는 계약 일부 강하게 말로 주석 코드에서?
주셔서 감사합니다 생각할 수 있습니다.
해결책
스마트 포인처럼 shared_ptr
고 unique_ptr
좋은 도구가 있을 때 소유 포인터입니다.
하지만 비유 포인터,즉 포인터를 관찰, 를 사용하여,원 포인터입니다.
에서 당신의 디자인,제가 생각하는 리소스 관리자만"소유자"의 자원,그래서 당신은 단순히 수은 어떤 형태의 스마트 포인터 안 리소스 관리자입니다.예를 들어,리소스 관리자가 있을 수 있는 std::vector<std::unique_ptr<Resource>>
으로 데이터 구성원 또는 단순 std::vector<Resource>
하는 경우 Resource
클래스가 될 수 있도록 설계 올바르게 저장할 수 있는지에 std::vector
.
그런 다음,리소스 관리자에게 줄 수 있는 외부 무관을 소유하는 관찰하는 점,그리고 원 포인터(또는 C++를 참조)은 이 경우입니다.
의 과정,그것의 중요한 수명 동안 발생하는 리소스의 관리자를 초과하는"리소스 클라이언트가".
다른 팁
결국,당신은 힘이 없다는 사람이 들어 있습니다.요청 마이크로소프트에서 애플이나 오픈 소스 라이브러리 개발자,그들은 그들 모두가 알고있는 노래입니다.댓글을에서 마우스 오른쪽 단어와 장소는 당신의 최선의 방법입니다.
을 만들지 않는 자신의 스마트 포인터를 클래스를,그것은 방해성 줄이고 가독성을 높입니다.마지막으로,시험 보고서,부스트 또는 프레임워크의 코드가 이미 있습니다.
만약 당신이 아닌 소유자,그들은 하나 electable 고 weak_ptr
s 또는(있다면 그것은 보장에 대해 유효한 기간)원 포인터입니다.
당신이 사용하는 경우 shared_ptr
s 내부적으로(당신은 왜),최고의 제공 weak_ptr
고 원 포인터입니다.
모든 사람들이 스마트 포인터를 명시적으로 나타내는 소유권 정책입니다.원 포인터내는 아무도 또는 비 소유한다.
auto_ptr
:를 사용하지 않는 사용되지 않으로 너무 많은 함정에도에 대한 조심하시길 바랍니다.unique_ptr
:단독 소유입니다.shared_ptr
:공동 소유권weak_ptr
:소유권,삭제 될 수 있습니다.- 원 포인터
- 명시적으로 소유권으로 보장 큰 일생
- 또는 매뉴얼 소유권을 관리합니다.
그래서 가정이 무엇 내가 찾는 것은 deferencable 합니하는 로 전환할 수 없습 shared_ptr.
할 수 있는 손으로 당신의 하나의 작은 도우미 클래스:
template<typename T>
class NonConvertibleWeakPtr
{
public:
NonConvertibleWeakPtr(const std::shared_ptr<T>& p) : p_(p) {}
... // other constructors / assignment operators
bool expired() const { return p_.expired(); }
T* operator->() const { return get(); }
T& operator*() const { return *get(); }
private:
T* get() const { return p_.lock().get(); }
private:
std::weak_ptr<T> p_;
};
이보다 약간 더 나은 원시인할 수 있기 때문에 체크인하는 경우 포인터입니다 여전히 유효합니다.
를 들어 사용:
std::shared_ptr<int> sp = std::make_shared<int>(5);
{
NonConvertibleWeakPtr<int> wp(sp);
if(!wp.expired()) {
std::cout << *wp << std::endl;
}
}
그러나 사용자가 아직도 그것을 오용 예를 들어과 std::shared_ptr<T> blah(&(*wp));
, 지만,그것은 약간 더 형 에너지입니다.