[C++] 스마트포인터

haeryong·2023년 1월 29일
0

Smart Pointer

#include <memory>

  • 크게 unique pointer와 shared pointer가 있다.
  • Resource Acquisition is Initialization(RAII) idiom을 위해서 사용.
  • 스마트포인터는 RAII 중 힙 메모리 Resource를 관리해준다.
  • Object의 Life cycle과 Resource의 Life cycle을 일치시켜 memory leak을 원천적으로 차단함.
std::unique_ptr<Obj> objPtr = std::make_unique<Obj>();
// scope를 벗어나거나 stack frame이 pop이 될 때 자동으로 delete
    
std::vector<Obj> objs(3);
// 여러개의 object를 사용할 경우 STL container를 사용.

unique_ptr

exclusive ownership : 하나의 object는 하나의 포인터만 가리킬 수 있음.

std::unique_ptr<Obj> objPtr = std::make_unique<Obj>();

shared_ptr

  • 하나의 object를 여러개의 포인터가 가리킬 수 있음.

Ref count : object를 몇개의 포인터가 가리키고 있는지 추적. Ref count가 0이 되면 object의 destructor 호출된다. use_count() 메소드를 이용하면 확인 가능.

  • memory leak의 위험이 있다. circular reference 문제. weak pointer를 이용해 해결 가능.
std::shared_ptr<Obj> objPtr = std::make_shared<Obj>();

weak pointer

  • 하나의 object를 여러개의 포인터가 가리킬 수 있음.
  • Ref count에 추가되지 않음.
  • shared_ptr로 전환 후 사용해야함.
std::weak_ptr<Obj> wPtr;
{
	std::shared_ptr<Obj> sPtr = std::make_shared<Obj>();
    wPtr = sPtr;
}
// sPtr이 scope를 벗어나 해제될 때 wPtr도 해제됨.

0개의 댓글