공부중

[C++]스마트포인터(Smartpointer) - shared_ptr 본문

Programing/C, C++

[C++]스마트포인터(Smartpointer) - shared_ptr

곤란 2018. 5. 30. 15:05
반응형

코드는 아래와 같다.



#include <iostream>
#include <memory>	//shared_ptr , make_shared

class MyClass
{
public:
	MyClass(int val_int = 0, double val_double = 0.0)
		: value_int(val_int), value_double(val_double) {};
	~MyClass() {};

private:

	int value_int;
	double value_double;
};

int main()
{

	/*

	가능하다면 메모리 리소스를 처음으로 만들 때 
	make_shared 함수를 사용하여 shared_ptr을 만들것.
	make_shared는 예외 안전하고 동일한 호출을 사용하여 
	제어 블록 및 리소스에대한 메모리를 할당하고 생성 오버헤드가 줄어듭니다.
	만일 make_shared를 사용하지 않은 경우 
	shared_ptr 생성자에 전달하기전에 새 명시적 식에 개체를 만드는데 사용해야 한다.

	*/

	std::shared_ptr<MyClass> obj1 =  std::make_shared<MyClass>(100, 3.14);

	auto obj2 = std::make_shared<MyClass>(200, 4.14);

	std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl;

	std::shared_ptr<MyClass> obj3 = obj1;

	std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl;
	std::cout << "obj3.use_count() : " << obj3.use_count() << std::endl;

	{

		std::cout << "==================== local area in ====================" << std::endl;

		std::shared_ptr<MyClass> localObj = obj3;

		std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl;
		std::cout << "obj3.use_count() : " << obj3.use_count() << std::endl;
		std::cout << "localObj_use_count() : " << localObj.use_count() << std::endl;

	}

	std::cout << "==================== local area out ====================" << std::endl;

	std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl;
	std::cout << "obj3.use_count() : " << obj3.use_count() << std::endl;

	return 0;
}


실행 결과


이름에서부터 보이다싶이 나 하나만 가져야되는것이 아닌 여러 다른 포인터가 같은 주소를 가리킬수 있는 포인터이다.

흔한 레퍼런스카운팅 방식으로 보이며

위의 코드에서 보이다 싶이 use_count() 메소드를 통해서 얼마나 카운팅 됬는지 확인 가능.


중간에 지역변수로 만들어서 카운트가 올라갔지만 지역을 벗어나 지역변수가 사라지자 카운팅이 내려간것이 보임.


주석에 보이다 싶이 처음 메모리 할당시 make_shared를 이용해서 생성할것을 추천한다고 그러하다.

MSDN에 관련 스마트 포인터 문서가 잘 설명 되어있다. - 링크

make_shared에 관해서는 더 찾아봐야 할듯....


추가로 shared_ptr을 사용하며 메모리 누수(Memory leak)에 관한 내용은 나중에 또 정리를 해야겠다.....


으읔 버그인지 뭔지 모르겠지만 사소한 궁금증이 저 메모리 누수 글을 막고있다 -_-;;







반응형