저번 포스팅에 이어 이번에는 나머지 스마트 포인터에 대해 알아보겠습니다.
1) shared_ptr의 문제점
shared_ptr의 문제점은 무엇일까요?
바로 refCount가 0이 되지 않는 이상은 delete가 되지 않는다는 것입니다.
위와 같은 상황이 된다면, 무슨 일이 벌어질까요?
서로가 서로를 참조하고 있는 상황이 되고,
한쪽이 delete되지 않는 이상은 삭제가 이루어질 수 없는 상황이 되버리게 됩니다.
위와 같은 사이클의 발생은 메모리 누수를 발생시키는 치명적인 문제를 만들게 됩니다.
2) weak_ptr
weak_ptr은 shared_ptr만으로는 풀어낼 수 없는 위와 같은 문제를 해결할 수 있습니다.
weak_ptr은 다음의 특징을 갖게 됩니다.
첫번째로, weak_ptr은 refCount가 0이 되면 shared_ptr과 마찬가지로 참조하고 있던 원본을 삭제합니다
그러나 refCount를 기록하는 refCount 블록 자체에는 영향을 주지 않습니다.
두번째로, weak_ptr은 반드시 shared_ptr과 같이 사용해야 합니다. 즉, 단독으로 사용할 수 없습니다.
마지막으로, weak_ptr은 weakRefCount라는 참조 횟수를 기록하는 다른 형태의 refCount를 갖고 있습니다.
weakRefCount 역시 refCount 블록에는 기록되지만, refCount와는 다르게 객체의 소멸에는 영향을 주지 않습니다.
위와 같은 특징으로 인해, weak_ptr은 상호참조로 들고 있어도 아무런 문제가 발생하지 않습니다.
3) weak_ptr의 활용
절차를 그대로 거치게 되면,
다음과 같은 실행결과를 얻을 수 있습니다.
weak_ptr은 shared_ptr과는 다르게 사이클을 확실하게 끊어낼 수 있지만, 조금 더 번거롭습니다.
그렇지만 프로그램의 안정성을 이끌어 낼 수 있다는 점에서 훨씬 더 유용하게 사용할 수 있을 것입니다.
4) unique_ptr
unique_ptr은 전의 shared_ptr이나 weak_ptr과는 다르게 매우 간단한 역할을 수행합니다.
unique_ptr이 참조하고 있는 객체에 대해 어떠한 종류의 복사를 막는 역할을 하게 됩니다.
즉, 하나의 객체에 대해 하나의 unique_ptr만이 참조할 수 있습니다.
위와 같이 복사하게 될 경우, 에러를 띄우며 컴파일 자체를 막는 것을 볼 수 있습니다.
그러나 예외적으로 이동을 사용하면 가능한데, 이는 이동이 기존의 객체를 일시적인 객체로 여겨 삭제하기에 가능합니다.
unique_ptr은 보통 매니저 클래스에서 사용되어 객체를 관리하는 역할을 수행할 때 사용됩니다.
이로써 3개의 스마트 포인터에 대해 배워보았습니다.
스마트 포인터를 사용함으로써 기존의 포인터가 지니고 있던 치명적인 문제점을 극복할 수 있습니다.
현대의 C++에서는 특히 스마트 포인터의 사용이 권장되는 만큼 매우 중요한 개념임을 다시 숙지해야 할 것입니다.
'C++' 카테고리의 다른 글
자료구조 - 연결 리스트 (0) | 2024.08.18 |
---|---|
스마트 포인터 - shared_ptr (0) | 2024.05.27 |
동적할당 (0) | 2024.04.29 |
iterator(반복자) (0) | 2024.04.29 |
오른값 참조 (0) | 2024.04.22 |