개발 Study

#42. 스마트 포인터

HYuk 2021. 11. 12. 16:50
728x90

스마트포인터 종류

1. unique_ptr

2. shared_ptr

3. weak_ptr

 

"스마트 포인터를 사용 하기 위해서는 #include <memory> 헤더를 추가해주어야 한다."

 

- unique_ptr

-> 포인터를 단독으로 소유하며, 복사나 대입이 불가함.

* 클래스 멤버 변수로 활용 할 때 좋음

* 지역 변수로 활용 할 때 좋음

* STL벡터에 포인터를 저장할 때 좋음 -> 벡터를 클리어 하게 되면 자동적으로 포인터를 지워줌

 

- shared_ptr

-> 두개의 포인터를 소유하며, 포인터를 다른 shared_ptr과 공유할 수 있음(레퍼런스 카운팅 기반)

* 어떠한 shared_ptr에게도 참조되지 않을 때(레퍼런스카운트가 0일 때) 포인터는 소멸됨

* 참조카운트를 감소 시킬 때는 .reset()을 해줌

 

- weak_ptr

-> 약한참조로 원시 포인터 해제에 영향을 끼지지 않음, *순환참조문제의 해결책

-> 약한참조로 참조되는 개체는 강한 참조(shared_ptr)카운트가 0이 될때 소멸함

* 직접적으로 사용할수 없으며, lock을 사용하여 shared_ptr의 존재를 확인해야함

shared_ptr<int> pShared = make_shared<int>();

weak_ptr<int> pWeak = pShared;

if(nullptr == pWeak.lock())
{
MSG_BOX("에러");
}

// 아래 같이 사용해도 괜찮음
/*
if(pWeak.expired())
{
MSG_BOX("Error");
}
*/

 

*순환참조란? 참조 횟수를 가지는 두 객체가 서로를 참조하고 있어 참조 카운트가 0이 되지 못해 스스로 메모리 해제가 불가능한 상황

 

728x90