본문 바로가기

프로그래밍/C++

C++11 스마트포인터



auto_ptr은 더이상 쓰지 않는다


http://egloos.zum.com/sweeper/v/2826435



스마트 포인터를 사용하기 위해서는


#include <memory>

using namespace std;


가 필요하다.



make_unique - 이동만 가능하며, 복사는 허용하지 않음


http://en.cppreference.com/w/cpp/memory/unique_ptr


auto sp = std::make_unique<int>(12);


//auto sp2 = sp; // error


auto sp3 = std::move(sp); 

// sp는 이제 empty, 소유권은 sp2에게 넘어감



make_shared - 포인터 복사가 가능, 내부적으로(Control Block) 참조카운트를 가지고 있음


http://en.cppreference.com/w/cpp/memory/shared_ptr


unique_ptr보다 사이즈가 2배가 큼



A->B, C->B, B->A 와 같은 순환참조의 경우 참조카운트가 꼬일수 있으므로


이럴때 weak_ptr을 사용한다.( 드문케이스 )


std::weak_ptr - 참조만 하며 내부카운트는 증가시키지 않는다.


주의해야 할점은 weak_ptr 가 shared_prt 보다 더 오래 살아 남아야 할 경우


사용하지 말아야 한다.


auto sp = std::make_shared<int>(12);


std::weak_ptr<int> sp2 = sp; // 여전히 참조카운트는 1


커스텀 메모리 관리 기능을 가진 클래스를 다루는 경우나


메모리가 넉넉치 않은 시스템에서 큰 객체를 자주 다뤄야 하는 경우를 제외하고는


new로 직접 할당하는 것보다 예외에 더 안전하므로, C++11 이상에서는


이와 같은 스마트 포인터 사용을 권장한다.


끝.