거의 알고리즘 일기장

순환의존성과 weak_ptr 본문

c++ 문법

순환의존성과 weak_ptr

건우권 2020. 4. 12. 22:27

1. weak_ptr의 필요성

 

 shared_ptr은 같은 곳을 몇 개의 객체에서 가리키는지를 추적하고, 그 수가 0 이 되야만 비로소 해제를 시켜주는 방식의 포인터이다.

 

 주제를 조금 넘어서지만 shared_ptr가 왜 필요한지 정말 간단히 예를 들어보자면 

#include <iostream>

using namespace std;

int main()
{
	int c = 5;
	int* a = &c;
	int* b = a;

	delete a;

	//오류!!
	cout << *b;

	return 0;
}

 이런 문제점을 해결하기 위해서 나왔다고 생각하면 될거같다.

 

 자 이제 원래 주제로 돌아가자면 weak_ptr은 shared_ptr의 같은 곳을 몇 개의 객체에서 가리키는지를 추적하고, 그 수가 0 이 되야만 비로소 해제를 시켜주는 방식에서 비롯된 문제를 해결하기 위해서 나왔다.

 

 그 문제는 아래에 코드에 주석에 설명해두었다.

 

#include <iostream>
#include <algorithm>
#include <memory>

using namespace std;

class Person
{
	string m_name;
	//Person class를 지우기 위해선 이게 지워져야 하는데
	//shared ptr은 몇개가 있는지 세어 아직 있으면 지우지 못하므로
	//Person class도 지우지 못하는 오류가 생긴다.
	//이떄 weak ptr를 사용한다.
	//weak ptr도 단점이 있는데 그건 밑에서 설명하겠다.

	//shared_ptr<Person> m_partner;
	weak_ptr<Person> m_partner;

public:
	Person(const string& name) : m_name(name)
	{
		cout << m_name << " crated\n";
	}

	~Person()
	{
		cout << m_name << " destroyed\n";
	}

	friend bool partnerUp(shared_ptr<Person>& p1, shared_ptr<Person>& p2)
	{
		if (!p1 || !p2)
			return false;
		
		p1->m_partner = p2;
		p2->m_partner = p1;

		cout << p1->m_name << " is partnered with " << p2->m_name << '\n';
		
		return true;
	}

	//weak ptr의 단점
	//이렇게 weak ptr -> shared ptr로 바꿔서 사용해야하는 번거로움이 존재한다.
	const shared_ptr<Person> getPartner() const
	{
		return m_partner.lock();
	}

	const string& getName() const
	{
		return m_name;
	}
};

int main()
{
	auto lucy = make_shared<Person>("lucy");
	auto ricky = make_shared<Person>("ricky");

	partnerUp(lucy, ricky);

	cout << lucy->getPartner()->getName() << endl;

	return 0;
}

2. 후기

 

 C++은 정말 어려운언어다.

 

 이 포스트는 홍정모의 따라하며 배우는 C++수업을 듣고 참고해서 개인공부용으로 작성하였습니다.

 미숙해서 틀린부분이 있을수도 있는데 말해주시면 수정하겠습니다.

반응형
Comments