C , C++, C#

[C/C++] weak_ptr

vhxpffltm 2020. 1. 9. 22:04
반응형

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 포인터를 반환 
    else cout << "소멸...NULL!!! \n";
}
 
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

https://modoocode.com/252

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