Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
순환의존성과 weak_ptr 본문
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++수업을 듣고 참고해서 개인공부용으로 작성하였습니다.
미숙해서 틀린부분이 있을수도 있는데 말해주시면 수정하겠습니다.
반응형
'c++ 문법' 카테고리의 다른 글
입출력 관련 함수들 (setw, setprecision, get, getline, ignore, putback, unget, peek) (0) | 2020.04.17 |
---|---|
string의 사용방법들 (예제) (0) | 2020.04.16 |
STL 반복자 _ iterator (0) | 2020.04.12 |
Lvalue와 Rvalue (0) | 2020.04.07 |
얕은 복사와 깊은 복사 (0) | 2020.04.05 |
Comments