memory헤더 파일에 정의되어있다.
0.auto_ptr
삭제되었다.
1.unique_ptr
특정 객체를 하나의 스마트포인터만 소유할수있도록 한다.
복사가 불가능하고 move() 함수를 통하여 소유권을 이전 할 수 있다.
unique_ptr<int> u_ptr1(new int(10));
unique_ptr<Test> u_ptr2 = make_unique<Test>(10);
//auto u_ptr3 = u_ptr1; //복사 불가
auto u_ptr4 = move(u_ptr2); //소유권 이전
u_ptr4.get(); //포인터 획득
u_ptr1.reset(); //reset으로 메모리 해제
u_ptr2.reset();
u_ptr4.reset();
const unique_ptr<int> c_u_ptr1(new int(10));
//auto c_u_ptr2 = move(c_u_ptr1); //const 는 소유권 이전도 불가능
2.shared_ptr
레퍼런스 카운팅을 통하여 관리되는 스마트 포인터로
참조 횟수가 0이 되면 자동으로 delete 가 불려 제거된다.
shared_ptr<int> s_ptr1(new int(10));
// make_shared 함수로도 생성가능
cout << s_ptr1.use_count() << endl; //1
auto s_ptr2 = s_ptr1;
cout << s_ptr1.use_count() << endl; //2
auto s_ptr3(s_ptr2);
cout << s_ptr1.use_count() << endl; //3
s_ptr3.reset();
cout << s_ptr1.use_count() << endl; //2
제거될때 delete 가 불리는것이지 delete[] 가 불리는게 아니라 일반적인 방법으로 배열에서 사용할수 없다.
shared_ptr 생성자에서 두번째 인자로 deleter를 받는다.
shared_ptr<MyClass> s_ptr1(new MyClass[3], [](auto* p) {delete[] p; });
s_ptr1.reset();
람다함수를 통하여 딜리터를 넘겨주었는데 잘된다.
3.weak_ptr
shared_ptr의 순환참조를 막기위하여 만들어진 스마트 포인터
shared_ptr을 받아 복사되나 레퍼런스 카운터에 영향을 주지않으며(약한참조)
lock함수를 통하여 shared_ptr로 변환해야 사용할수있다.
728x90
'프로그래밍 언어 노트 > C++ | Modern C++' 카테고리의 다른 글
[C++] 숨겨진 This pointer 는 어떻게 넘어 가는가~ (0) | 2019.07.01 |
---|---|
[모던 C++] C++의 아버지 스트로스트눕이 해주는 모던 C++ 이야기 (0) | 2019.06.01 |
[Visual Studio] Template의 intellisence (0) | 2018.10.07 |
[C++] C++ 의 RTTI, typeid (0) | 2018.10.01 |
[모던 C++] 킹갓 auto 와 decltype (0) | 2018.10.01 |