weak_ptr은 객체가 존재하면서도 삭제가 가능한 포인터이다.
스마트 포인터 처럼 객체를 안전하게 참조할 수 있게 하지만, shared_ptr과는 다르게 참조 개수를 늘리지는 않는다.
따라서 설사 어떤 객체를 weak_ptr 가 가리키고 있다고 하더라도, 다른 shared_ptr 들이 가리키고 있지 않다면 이미 메모리에서 소멸되었을 것입니다.
그래서 weak_ptr을 사용할 때에는 원래 객체로 사용할 수 없고 shared_ptr로 변환해서 사용해야 한다. 이때 가리키고 있는 객체가 이미 소멸되었다면 빈 shared_ptr 로 변환되고, 아닐경우 해당 객체를 가리키는 shared_ptr 로 변환된다.
전체 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include<iostream>
#include<iomanip>
#include<memory>
using namespace std;
struct info {
int val;
info(int i) : val{ i } {}
~info() { cout << "소멸자 info" << val << '\n'; }
};
void weak_info(const weak_ptr<info> &p) {
cout << "--------------" << boolalpha
<< "\nexpired: " << p.expired() // 가리키는 객체가 아직 존재하는지 알려줌
<< "\nuse_count: " << p.use_count() // 몇 개의 shared_ptr 인스턴스를 가리키는가
<< "\ncontent: ";
if (const auto sp(p.lock()); sp) {
cout << sp->val << "\n";
}// 실제 객체에 접근할 땐 lock함수 호출, lock함수는 해당 객체에 대한 shard 포인터를 반환
}
int main()
{
weak_ptr<info> weak; // weak 포인터를 인스턴스로 만든다음
weak_info(weak); // 비어있는 내용 출력
{
auto shared_info(make_shared<info>(1000)); // 새로운 영역에서 새 shared 포인터를 info 클래스의 새로운 인스턴스로 생성
weak = shared_info; // weak 포인터로 복사 * 이렇게 해도 shared 포인터의 참조 카운터는 증가하지 않음
weak_info(weak); // 단 하나의 shared 포인터가 소유자이므로 참조 카운터는 1
auto shared_info2(make_shared<info>(1001));
weak = shared_info2;
weak_info(weak);
}
weak_info(weak);
//해당영역을 벗어나기 전과 후에 weak 포인터 함수로 확인
//weak 포인터가 가리키고 있더라도 info 인스턴스는 곧바로 소멸해야 한다.
//weak 포인터는 객체가 해제되어 있어도 제어 블록에 남아있다면 남아있다. weak 포인터가 사라질 때 제어블록이 삭제된다.
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
실행 결과이다.
각 코드의 내용은 주석을 통해 이해할 수 있다. 중요한건 주석의 마지막 줄이다.
shared_ptr 이 소멸자 info~~ 를통해 삭제되었다고 해서 제어블록마저 삭제되지 않는다.
Refernce
c++17 STL 프로그래밍
'C , C++, C#' 카테고리의 다른 글
[C/C++] Thread (0) | 2020.01.19 |
---|---|
[C/C++] Callable, std::function (0) | 2020.01.14 |
[C/C++] Shared_ptr (0) | 2020.01.06 |
[C/C++] unique_ptr (0) | 2019.12.28 |
[C/C++] iterator (반복자) (0) | 2019.12.11 |