[Modern C++] Smart Pointer

smart pointer

스마트 포인터는 dangling 포인터의 문제를 해결해준다. C++의 RAII 디자인 패턴을 기반으로 한 포인터이다. 스마트 포인터의 특징은 다음과 같다.

  • 오토포인터의 단점인 new[]의 해제 불가 문제 해결
    • 스마트포인터의 해제는 해제할 메모리영역 + 4바이트로 크기가 결정된다
    • 4바이트는 해제할 메모리 영역의 크기를 담고있는 정보다
  • dangling포인터 문제 해결
  • 하나의 객체로 생성자와 소멸자를 가지며 자동으로 동적할당된 메모리가 파일스코프를 벗어났을때 해제한다

unique_ptr

하나의 객체 참조는 하나만 가능하며 소유권을 이전한다

shared_ptr

하나의 객체를 여러개가 참조가능하며 count가 0이되면 소멸한다

weak_ptr

shared_ptr의 순환 참조 문제를 해결하며 count에 영향을 미치지 않는다

Code

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
#include <iostream>
#include <memory>

using namespace std;

int main(){
unique_ptr<int> p1(new int(1));
//unique_ptr<int> p2 = p1; //ERROR
unique_ptr<int> p3 = move(p1); //소유권 이전
cout << p1.get() << endl;
cout << p3.get() << endl;

shared_ptr<int> p4(new int(1));
shared_ptr<int> p5 = p4;
cout << p5.use_count() << endl;
p4.reset();
cout << p5.use_count() << endl;
p5.reset();
cout << p5.use_count() << endl;

shared_ptr<int> p6(new int(1));
weak_ptr<int> p7 = p6;
cout << p6.use_count() << endl;
cout << p7.use_count() << endl;{
shared_ptr<int> p8 = p7.lock();
cout << p6.use_count() << endl;
cout << p7.use_count() << endl;
}
cout << p6.use_count() << endl;
cout << p7.use_count() << endl;
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/21/Languages/Cplusplus/smart-pointer/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.