개발 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