표준 삼 종 스마트 포인터에 대해서 알아보자.
unique_ptr
unique_ptr<class> ptr = make_unique<class>();
// 일반 포인터와 거의 동일
// 차이점이라하면 복사가 안된다는 점
// 복사를 하고 싶다면
unique_ptr<class> copy = std::move(ptr); // 이렇게 하자
// 소멸을 알아서 해준다는 점
shared_ptr
shared_ptr<class> ptr(new class());
// -> [class mem][RefCount mem] // 내부적으로 메모리 공간을 2개 할당한다.
shared_ptr<class> ptr = make_shared<class>();
// -> [class mem | RefCount mem] // 내부적으로 메모리 공간을 1개 할당한다.
// 이렇게 메모리 공간을 나눈 이유?
// class mem을 날리고 나면 RefCount를 통해 메모리할당 해지를 했는지 확인(weak ptr expired)이 가능하기에
weak_ptr
shared_ptr<class> sptr = make_shared<class>();
weak_ptr<class> wptr = sptr;
// 사용은 이렇게
bool expired = wptr.expired();
// 만약 매번 expired 체크가 번거롭다면
shared_ptr<class> sptr2 = wptr.lock(); // shared_ptr로 캐스팅
// (참고) [RefCount mem]의 내부적으론 useCount(shared mem), weak Count를 보관하고 있는다