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> 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; }
|