> 백엔드 개발 > C++ > 본문

`this`의 `std::shared_ptr`을 관련 개체에 안전하게 전달할 수 있는 방법은 무엇입니까?

DDD
풀어 주다: 2024-10-28 21:01:30
원래의
831명이 탐색했습니다.

How Can I Safely Pass a `std::shared_ptr` of `this` to a Related Object?

"std::shared_ptr of this" 딜레마 이해

스마트 포인터 사용에서 두 개의 관련 객체 A와 B가 다음에 액세스해야 하는 시나리오가 종종 발생합니다. 서로. 그러나 이 연결을 설정하기 위해 std::shared_ptr을 전달하는 것은 어렵습니다.

예를 들어, 하위 객체 B를 추가해야 하는 상위 클래스 A를 생각해 보세요. 상위의 addChild 메소드는 이상적으로 std::를 전달해야 합니다. shared_ptr을 자식에 할당하므로 부모를 참조할 수 있습니다.

그러나 this 포인터가 rvalue이기 때문에 직접 자식>setParent(this) 시도는 실패합니다. 이 문제를 해결하기 위해 C에서는 std::enable_shared_from_this를 제공합니다.

해결책: std::enable_shared_from_this

std::enable_shared_from_this는 std::shared_ptr을 통해 객체 공유를 용이하게 하는 클래스 템플릿입니다. 이를 상속함으로써 수정된 코드에서 볼 수 있듯이 필요한 std::shared_ptr을 제공하는 shared_from_this()에 액세스할 수 있습니다.

<code class="cpp">class A : public std::enable_shared_from_this<A> {
...
child->setParent(shared_from_this()); // now valid
};</code>
로그인 후 복사

또한 메모리 누수로 이어질 수 있는 순환 종속성을 방지하기 위해 , 부모의 존재에 의존하는 자식에 대해서는 std::weak_ptr을 사용하는 것이 좋습니다.

<code class="cpp">std::list<std::weak_ptr<B>> children; // now using weak_ptr</code>
로그인 후 복사

주의사항

.shared_from_this()는 호출할 때만 호출해야 한다는 점에 유의하는 것이 중요합니다. 객체는 std::shared_ptr에 의해 관리됩니다. 이는 스택에서 생성될 수 없으며 일반적으로 생성자나 소멸자에서 호출될 수 없음을 의미합니다.

위 내용은 `this`의 `std::shared_ptr`을 관련 개체에 안전하게 전달할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿