- 요소를 참조만 할 뿐 소유권을 가지지 않기 때문에 참조 카운트를 증가시키지 않는다.
- shared_ptr끼리 상호 참조할 경우 메모리가 해제되지 않는 문제를 방지한다.
- 순환 참조 문제가 없는 경우에는 필요하지 않으며, 주로 복잡한 객체 관계가 있는 상황에서 유용하다.
⦁ 예시
class Node {
public:
std::shared_ptr<Node> next;
std::weak_ptr<Node> prev;
~Node() {
std::cout << "Node destroyed" << std::endl;
}
};
int main() {
auto node1 = std::make_shared<Node>();
auto node2 = std::make_shared<Node>();
node1->next = node2;
node2->prev = node1;
return 0;
}
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;
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와의 소유권 관계를 비교 |