shared_ptr

Yongs12 ㅣ 2023. 7. 16. 16:56

shared_ptr는 unique_ptr에서 공유 소유권을 추가한 스마트 포인터이다.

참조 카운팅 방식을 사용하여 객체를 참조하는 shared_ptr이 모두 소멸할 때 자원이 자동으로 해제가 된다.

 

 

#include <iostream>

class Test
{
public:
    Test() {}
    ~Test() {}

    void PrintTest()
    {
        std::cout << "Test" << std::endl;
    }
};

int main()
{
    // shared_ptr를 통해 객체를 생성
    std::shared_ptr<Test> sharedTest = std::make_shared<Test>();

    // shared_ptr는 객체를 공유할 수 있다.
    std::shared_ptr<Test> sharedTest2 = sharedTest;

    // 두 개의 shared_ptr가 동일한 객체를 공유하고 있다.
    sharedTest->PrintTest();
    sharedTest2->PrintTest();

    std::cout << "Shared Count: " << sharedTest.use_count() << std::endl;  // 공유 횟수 출력

    // shared_ptr 참조 객체들의 유효 범위가 끝날 때 객체는 자동으로 해제된다.

    return 0;
}

 

 

주의

순환 참조 예시

 

#include <iostream>
#include <memory>

class A;

class B
{
public:
    std::shared_ptr<A> aPtr;  // A 클래스에 대한 shared_ptr
    ~B() { std::cout << "B destroyed\n"; }
};

class A
{
public:
    std::shared_ptr<B> bPtr;  // B 클래스에 대한 shared_ptr
    ~A() { std::cout << "A destroyed\n"; }
};

int main()
{
    // A와 B 객체를 각각 생성
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();

    // A와 B가 서로를 참조함
    a->bPtr = b;
    b->aPtr = a;

    // 여기서 순환 참조가 발생, A와 B는 서로를 계속 참조하고 있기 때문에
    // 참조 카운트가 0이 되지 않음
    // 이 상태에서 main()이 종료되어도 A와 B는 삭제되지 않음

    return 0;
}

'C, C++' 카테고리의 다른 글

<thread>  (0) 2024.02.20
weak_ptr  (0) 2023.07.17
unique_ptr  (0) 2023.07.15
<unordered_map>, <unordered_set>  (0) 2023.07.11
<map>, <set>  (0) 2023.07.10