article thumbnail image
Published 2020. 11. 14. 04:01

1. 쉐어드 포인터는 복사 연산, 이동 연산, 관련 생성자 모두를 지원한다.

 

2. 레퍼런스 카운팅을 통해서 객체의 소멸을 관리한다는 점에서, ComPtr과 비슷하게 보일 수 있으나, 내부적으로는 전혀 그렇지 않다. 가령 ComPtr를 통해서 ID3D11Device 객체를 ID3D11Device3 에 할당한다면, invasive 레퍼런스 카운팅에 의해서 객체의 복사, 이동이 자유롭게 일어나지만, shared_ptr은 COM 객체에 대해서 non-invasive이기 때문에, 불가능하다.

 

3. 유니크 포인터와 마찬가지로 make_shared 헬퍼 함수를 통해서 객체를 생성하는 것이 좋다.

 

4. 레퍼런스 카운팅이 0이 되는 것은 의미가 없다.

 

#include "Precompiled.h"
#include <memory>
using namespace std;

auto main() -> int {
	auto sp = shared_ptr<int>{};	// 생성자가 발동하지 않기 때문에, 레퍼런스 카운트도 0이다.
	ASSERT(!sp);
	ASSERT(sp.use_count() == 0);
	ASSERT(!sp.unique());			// 카운트가 0이라는 뜻은, 객체가 유일하다는 것을 의미하지 않는다.
									// 따라서 아무것도 의미하지 않는다. 사실은 존재하지도 않는다.

	sp = make_shared<int>(123);		// 객체가 생성되었기 때문에, 레퍼런스 카운트는 1이다.

	ASSERT(sp);
	ASSERT(sp.use_count() == 1);
	ASSERT(sp.unique());

	auto sp2 = sp;

	ASSERT(sp.use_count() == 2);
	//ASSERT(sp.unique());			 // 카운트가 1이 아니기 때문에 에러를 던진다.

	int copy = *sp;					 // 복사 연산을 제공하기 때문에, copy는 sp와는 다른 주소를 같는다.
	int& ref = *sp;
	int* ptr = sp.get();

	ASSERT(sp.get() == sp2.get());	 // sp와 sp2의 원시 포인터가 같기 때문에
	ASSERT(sp == sp2);				 // 모두 참이 된다.
}

'C++' 카테고리의 다른 글

스마트 클래스  (0) 2020.11.15
클래스 구현 시, 생각해야 할 것  (0) 2020.11.14
윈도우 HANDLE 과 COM 인터페이스에 대해서.  (0) 2020.11.14
유니크 포인터  (0) 2020.11.13
Assertion  (0) 2020.11.13
복사했습니다!