SW/C++

C++ : weak_ptr : 약한 참조 개념, 사용법, 예제, 구현

얇은생각 2020. 5. 9. 07:30
반응형

C++ : weak_ptr : 약한 참조 개념, 사용법, 예제, 구현

 

약한 참조

약한 참조는 원시 포인터 해제에 영향을 끼치지 않습니다. 약한 참조 카운트는 약한 참조의 수를 저장하는 데 사용됩니다. 약한 참조로 참조되는 개체는 강한 참조 카운트가 0이 될 때 소멸됩니다. 순환 참조 문제의 해결책입니다. 

 

#include <memory>
#include "Persion.h"

int main()
{
  std::shared_ptr<Persion> owner = std::make_shared<Persion>("pp");
  std::weak_ptr<Persion> weakOwner = owner;
  
  return 0;
}

 

 

약한 포인터로 공유 포인터 만들기

#include <memory>
#include "Persion.h"

int main()
{
  std::shared_ptr<Persion> owner = std::make_shared<Persion>("pp");
  std::weak_ptr<Persion> weakOwner = owner;
  
  std::shared_ptr<Persion> lockedOwner = weakOwner.lock();
  
  return 0;
}

 

 

원시 포인터가 존재하면 공유 포인터를 만듭니다.

 

 

공유 포인터가 존재하는 지 확인하기

 

#include <memory>
#include "Persion.h"

int main()
{
  std::shared_ptr<Persion> owner = std::make_shared<Persion>("pp");
  std::weak_ptr<Persion> weakOwner = owner;
  
  auto ptr = werOwner.lock();
  if (ptr == nullptr)
  {
    //
  }
    
  return 0;
}

 

#include <memory>
#include "Persion.h"

int main()
{
  std::shared_ptr<Persion> owner = std::make_shared<Persion>("pp");
  std::weak_ptr<Persion> weakOwner = owner;
  
  if (weakOwner.expired())
  {
    // ...
  }
    
  return 0;
}

 

#include <memory>
#include "Persion.h"

int main()
{
  std::shared_ptr<Persion> owner = std::make_shared<Persion>("pp");
  std::weak_ptr<Persion> weakOwner = owner;
  
  owner = nullptr
  if (weakOwner.expired()) // true 반환
  {
    // ...
  }
    
  return 0;
}

 

약한 참조와 강한 참조의 개념을 잘 잡은 다음, 스마트 포인터를 적절하게 활용한다면, 더욱 안전한 프로그램을 만들 수 있을 것이라는 생각이 들었습니다.

반응형