이 주제와 관련하여 이미 몇 가지 질문이 있지만 무엇을해야할지 모르겠습니다. 코드베이스는 shared_ptr
을 여러 곳에서 사용합니다. 나는 그것을 쓸 때 소유권을 명확하게 정의하지 않았다는 것을 인정해야한다.메소드에 전달할 때 shared_ptr을 weak_ptr로 변환해야합니까?
우리는 나는 우리의 디자인에서 실수를 수정하고 싶은 첫 번째 (간접) 순환 종속성을 발견 한 후
void doSomething(shared_ptr<MyClass> ptr)
{
//doSomething() is a member function of a class, but usually won't store the ptr
ptr->foo();
...
}
같은 몇 가지 방법이있다. 그러나 나는 정확히 어떻게 확신 할 수 없다. 위의 방법을 변경하면 어떤 이점이 있습니까
void doSomething(weak_ptr<MyClass> ptr)
{
shared_ptr<MyClass> ptrShared = ptr.lock();
ptrShared->foo();
...
}
?
Google 스타일 가이드를 포함하여 처음에는 소유권을 올바르게 유지하는 것이 중요하다고 말하기 때문에 혼란 스럽습니다 (위의 방법을 사용한 예에서와 같이 많은 사람들이 아마도 weak_ptrs
의 도입을 의미 할 수도 있지만 또한 우리가 가지고있는 많은 멤버 변수들에 대해서). 순환 종속성을 깨기 위해 weak_ptr을 사용해야한다고 말하는 사람들도 있습니다 (아래 링크 참조). 그러나 그것들을 감지하는 것이 항상 쉬운 일은 아니기 때문에 문제가 발생하여 (그리고 깨닫게 될 때까지) shared_ptr을 사용해야하는지 궁금하다.
의견을 보내 주셔서 감사합니다.
우리는 명확하게 소유권을 정의하지 않았다 또한
- shared_ptr and weak_ptr differences
- boost::shared_ptr cycle break with weak_ptr
- boost, shared ptr Vs weak ptr? Which to use when?
shared_ptr & 더 좋을까요? –
DanDan
"그들을 탐지하는 것이 항상 쉬운 것은 아닙니다"- 그렇다면 실제로 설계 프로세스에 더 많은 단계를 추가해야합니다. 클래스 관계 다이어그램의 밝은 선과 어두운 선. 또한 모든 "비 소유자"가되기 전에 "소유자"가 파괴되지 않는 대부분의 비대칭 관계에 대해 약한 포인터가 아닌 원시 포인터로 브레이크주기를 고려할 수 있습니다. –
@ DanDan : 나는 그렇게 생각하지 않는다. http://stackoverflow.com/questions/327573/c-passing-references-to-boostshared-ptr – Philipp