C++ 에서는 스마트 포인터라는 것을 사용하여 포인터를 더욱 안전하고 효율적으로 사용할 수 있습니다.
스마트 포인터에는 다음과 같이 3가지가 존재합니다.
- unique_ptr
- shared_ptr
- weak_ptr
기존의 포인터의 경우에는 new
와 delete
가 한 쌍으로 사용되었으나 프로그래머의 실수로 delete
를 하지 않게 될 경우에는 메모리 누수로 이어졌습니다.
오늘은 이 스마트 포인터 중 weak_ptr
을 소개 합니다.
참조 개수를 늘리지 않는 shared_ptr (weak_ptr) (C++11)
shared_ptr
는 참조할 때마다 참조 개수가 늘어나지만 weak_ptr
은 참조의 개수를 늘이지 않습니다.
weak_ptr
은 소유(Own)하는 참조가 아닌 임시적 참조(Temporary Ownership)를 수행합니다.
template <class T>
class weak_ptr;
weak_ptr
를 사용하기 위해서는 shared_ptr
로 변환하여 사용해야합니다.
(It must be converted to std::shared_ptr
in order to access the referenced object.)
그 이유는 weak_ptr
이 shared_ptr
로 관리되는 포인터이기 때문이죠.
(std::weak_ptr
is a smart pointer that holds a non-owning ("weak") reference to an object that is managed by std::shared_ptr
.)
weak_ptr을 shared_ptr로 변환하는 lock() 함수
std::shared_ptr<T> lock() const noexcept;
반환형이 shared_ptr
이며 현재 공유되고 있는 포인터를 반환하는데 만약에 포인터가 없다면 std::weak_ptr::expired
를 반환합니다.
#include <iostream>
#include <memory>
#include <string>
class Human
{
private:
int m_nAge;
std::string m_strName;
std::weak_ptr<Human> m_ptr;
public:
Human(int nAge = 0, std::string strName = "") : m_nAge(nAge), m_strName(strName)
{ printf("Human 생성 (%d, %s)\n", nAge, strName.c_str()); }
~Human() { printf("Human 소멸 (%d, %s)\n", m_nAge, m_strName.c_str()); }
// weak_ptr를 설정하는 함수
void SetPtr(std::weak_ptr<Human> ptr) { m_ptr = ptr; }
// m_ptr의 내용을 출력하는 함수
void PrintPtr()
{
// lock 함수를 이용하여 shared_ptr로 변환합니다.
std::shared_ptr<Human> ptr = m_ptr.lock();
printf("Human's m_ptr - %d %s\n", ptr->m_nAge, ptr->m_strName.c_str());
}
};
int main(void)
{
std::shared_ptr<Human> pHuman1 = std::make_shared<Human>(22, "Hong");
std::shared_ptr<Human> pHuman2 = std::make_shared<Human>(33, "Kim");
pHuman1->SetPtr(pHuman2);
pHuman1->PrintPtr();
pHuman2->SetPtr(pHuman1);
pHuman2->PrintPtr();
return 0;
}
참고 자료
'Study > C++' 카테고리의 다른 글
[C++] ImGui - C++용 GUI Library (0) | 2023.01.07 |
---|---|
[C++] 자료구조 Queue(큐) 만들어 보기 (0) | 2022.09.22 |
[C++11] 스마트 포인터2 (shared_ptr) (1) | 2022.09.20 |
[C++11] 스마트 포인터1 (unique_ptr) (0) | 2022.09.19 |
[C++] std::array (C++ 표준 라이브러리 배열 컨테이너 이야기) (0) | 2022.09.18 |