weak_ptr

김민수·2025년 1월 8일

C++

목록 보기
36/68
  • 요소를 참조만 할 뿐 소유권을 가지지 않기 때문에 참조 카운트를 증가시키지 않는다.
  • shared_ptr끼리 상호 참조할 경우 메모리가 해제되지 않는 문제를 방지한다.
  • 순환 참조 문제가 없는 경우에는 필요하지 않으며, 주로 복잡한 객체 관계가 있는 상황에서 유용하다.

⦁ 예시

class Node {
public:
    std::shared_ptr<Node> next;
    std::weak_ptr<Node> prev;  // 순환 참조 방지를 위해 weak_ptr 사용

    ~Node() {
        std::cout << "Node destroyed" << std::endl;
    }
};

int main() {
    auto node1 = std::make_shared<Node>();
    auto node2 = std::make_shared<Node>();

    node1->next = node2;  // node1이 node2를 참조
    node2->prev = node1;  // node2가 node1을 약하게 참조

    return 0;  // node1과 node2가 정상적으로 소멸
}


1. shared_ptr와의 관계

  • weak_ptr는 반드시 shared_ptr로 관리되는 자원을 참조해야함
  • weak_ptr는 항상 shared_ptr로 변환(lock())해서 사용해야함
int main() {
    std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
    std::weak_ptr<int> weakPtr = sharedPtr;

    // lock()으로 자원 사용
    if (auto sp = weakPtr.lock()) {
        std::cout << "Shared value: " << *sp << std::endl;
    } else {
        std::cout << "Resource no longer available." << std::endl;
    }

    sharedPtr.reset();  // 자원 해제

    if (weakPtr.expired()) {
        std::cout << "Weak pointer expired." << std::endl;
    }

    return 0;
}

2. 주요 함수

함수설명
lock()유효한 자원일 경우 std::shared_ptr를 반환. 그렇지 않으면 빈 shared_ptr 반환
expired()참조하는 자원이 유효하지 않은 경우 true 반환
use_count()참조 중인 std::shared_ptr의 참조 카운트를 반환
reset()참조를 끊고 초기화
owner_before()다른 weak_ptr나 shared_ptr와의 소유권 관계를 비교
profile
안녕하세요

0개의 댓글