본문 바로가기

프로그래밍 언어 노트/C++ | Modern C++

[모던 C++] 스마트 포인터

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