반응형
shared_ptr처럼 가리키는 대상에 참조 형식으로 포인팅하지만, counter에 영향을 주지 않는다.
그리고 weak_ptr이 소멸하더라도 대상 객체를 삭제하지 않는다.
shared_ptr을 사용해야하지만 counter는 하지 않을 때 필요하다.
FOOD 클래스에 어울리는 음식을 set하는 기능이 추가되었다고 하자.
setWithFood는 shared_ptr의 객체를 받아 withFood에 설정한다.
#include <stdio.h>
#include <memory> // shared_ptr, weak_ptr header
#include <iostream>
using namespace std;
class FOOD
{
private:
int price = 0;
shared_ptr<FOOD> withFood;
public:
FOOD() { printf("FOOD created\n"); }
~FOOD() { printf("FOOD deleted\n"); }
virtual void printName() { cout << "FOOD Class" << endl; }
virtual void printPrice() { cout << this->price << endl; }
void printLine() { cout << "=================" << endl; }
void setWithFood(shared_ptr<FOOD>& food)
{
this->withFood = food;
}
};
int main(void)
{
cout << "start main\n" << endl;
shared_ptr<FOOD> chicken(new FOOD);
shared_ptr<FOOD> beer(new FOOD);
cout << "chck count : " << chicken.use_count() << endl;
cout << "beer count : " << beer.use_count() << endl << endl;
{
chicken->setWithFood(beer);
}
cout << "chck count : " << chicken.use_count() << endl;
cout << "beer count : " << beer.use_count() << endl << endl;
{
beer->setWithFood(chicken);
}
cout << "chck count : " << chicken.use_count() << endl;
cout << "beer count : " << beer.use_count() << endl << endl;
return 0;
}
setWithFood의 scope가 끝나도 FOOD class의 withFood가 소멸하지 않기 때문에,
use_count가 감소하지 않았다.
즉, chicken과 beer가 서로를 참조하게 되면서 정상적으로 메모리가 해제하지 않게 된다.
따라서 counter가 되지 않는 포인터가 필요하다는 것을 알 수 있다.
이제 withFood의 type을 weak_ptr로 바꿔주면 해결된다.
class FOOD
{
private:
int price = 0;
weak_ptr<FOOD> withFood;
반응형
'개발 > C, C++' 카테고리의 다른 글
C++ - 우측값 참조 r-value reference (기본 자료형) (0) | 2021.10.25 |
---|---|
C++ 스마트 포인터 : unique_ptr (0) | 2021.10.16 |
C++ 스마트 포인터 : shared_ptr (0) | 2021.10.12 |
C++ 스마트 포인터 : auto_ptr (0) | 2021.10.10 |
C++ 스마트 포인터 (Smart Pointer) (0) | 2021.10.03 |
댓글