>백엔드 개발 >C++ >\'this\'의 `std::shared_ptr`을 C의 상위 개체에서 하위 개체로 안전하게 전달할 수 있는 방법은 무엇입니까?

\'this\'의 `std::shared_ptr`을 C의 상위 개체에서 하위 개체로 안전하게 전달할 수 있는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-29 13:12:29957검색

How can I safely pass a `std::shared_ptr` of

"this"에 대한 참조를 전달하기 위해 std::shared_ptr을 사용하는 방법

객체 지향 프로그래밍에서는 객체에 대해 일반적입니다. 서로 관계를 유지하기 위해. 여기에는 종종 서로에 대한 참조를 보유하는 객체가 포함되어 통신 및 데이터 공유가 가능합니다. C에서 객체 참조를 관리하는 한 가지 방법은 스마트 포인터, 특히 std::shared_ptr을 사용하는 것입니다.

클래스 A가 클래스 B의 객체에 대한 std::shared_ptr 참조 목록을 보유하는 가상 시나리오를 생각해 보세요. 여기서 각 B 객체는 상위 A 객체에 대한 참조도 보유해야 합니다. 이는 도전 과제를 제기합니다. 클래스 A가 자신의 std::shared_ptr(this)을 하위 B에게 안전하게 전달할 수 있는 방법은 무엇입니까?

간단한 접근 방식은 child->setParent(this)와 같은 것을 시도하는 것일 수 있습니다. , 그러나 이는 유효한 std::shared_ptr이 아니기 때문에 올바르지 않습니다. 해결책은 std::enable_shared_from_this를 사용하는 것입니다.

std::enable_shared_from_this

std::enable_shared_from_this 소개는 객체가 std를 반환할 수 있도록 하는 기본 클래스입니다. ::shared_ptr 자신에 대한 참조입니다. std::enable_shared_from_this를 상속함으로써 클래스 A는 .shared_from_this()를 호출하여 자체 인스턴스에 대한 공유 포인터를 얻을 수 있는 기능을 얻습니다.

std::enable_shared_from_this를 사용하는 솔루션

아래 수정된 코드에서 클래스 A는 std::enable_shared_from_this에서 상속하도록 만들어졌으며 child->setParent() 호출은 이제 .shared_from_this()를 사용합니다.

<code class="cpp">class A : public std::enable_shared_from_this<A>
{
public:
    void addChild(std::shared_ptr<B> child)
    {
        children.push_back(child);
        child->setParent(shared_from_this());
    }

private:
    // Note the use of std::weak_ptr here
    std::list<std::weak_ptr<B>> children;
};</code>

이 업데이트에서 코드:

  • 클래스 A는 std::enable_shared_from_this를 상속하여 .shared_from_this() 사용을 활성화합니다.
  • .shared_from_this()는 클래스 A의 인스턴스에 대한 공유 포인터를 반환합니다. 그런 다음 B 객체로 안전하게 전달됩니다.
  • std::weak_ptr은 순환 종속성을 방지하고 리소스 누출을 방지하기 위해 클래스 A의 하위 목록에 사용됩니다.

이 접근 방식으로 문제가 해결됩니다. 부모 A 객체에서 자식 B 객체로 "this"의 std::shared_ptr을 전달하는 문제. std::enable_shared_from_this를 사용하고 std::weak_ptr로 순환 종속성을 관리하면 안전하고 효과적인 참조 공유 메커니즘이 달성됩니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.