본문 바로가기
개발/C, C++

C++ 스마트 포인터 : weak_ptr

by 피로물든딸기 2021. 10. 14.
반응형

C, C++ 전체 링크

 

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;

 

반응형

댓글