* 정의

 

std::unique_ptr 스마트 포인터는 생 포인터와 비교했을 때 크기가 거의 비슷하고 동일한 명령들을 실행하며 독점적 소유권(exclusive ownership)를 가진다. 소유권을 독점해야하는 자원관리에 사용된다.

 

 

* 동작 방식

 

- 특징

 

기본적인 특징은 다음과 같이 정리할 수 있다.

  • 널이 아닌 std::unique_ptr는 항상 자신이 가리키는 객체를 소유하며, 소멸 시 자신이 가리키는 자원을 파괴한다.
  • std::unique_ptr을 이동하면 소유권이 원본 포인터에서 대상 포인터로 옮겨진다.
  • 독점적 소유권을 보장하기 위해 복사를 허용하지 않는다.
  • 작고 빠른 이동 전용 형식(move-only type) 스마트 포인터이다.
  • 기본적으로 자원 파괴는 delete를 통해 수행되며 이를 커스터 삭제자(custom deleter)를 사용하면 변경할 수 있다. 상태 있는 삭제자나 함수 포인터를 사용하면 std::unique_ptr 객체의 크기가 커진다.
  • std::unique_ptr을 std::shared_ptr로 변환할 수 있다.

 

 

- 커스텀 삭제자 예시

 

// 커스텀 삭제자
auto DeleterObject = [](Object* obj)
{
	obj->printData();
	delete obj;
};

void UniquePtr_CustomDeleter(void)
{
	std::unique_ptr<Object, decltype(DeleterObject)> objPtr(new Object(0, "obj"), DeleterObject);

	//std::unique_ptr<Object, decltype(DeleterObject)> objPtr(nullptr, DeleterObject);
	//objPtr.reset(new Object(0, "obj1"));
}
id : 0 , name : obj

 

 

- 생성, 사용 예시

 

// 유니크 포인터 반환하는 함수
std::unique_ptr<Object> ObjectFactory(const int id, const std::string& name)
{
	if (0 > id)
	{
		return nullptr;
	}

	return std::make_unique<Object>(id, name);
}

void UniquePtr_Test(void)
{
	// 일반적인 유니크 포인터 생성
	std::unique_ptr<Object> obj0 = std::make_unique<Object>(0, "obj0Name");

	// 유니크 포인터 접근
	std::string obj0Name = obj0->_name;
	std::cout << "obj0 : " << obj0Name << '\n';

	// 유니크 포인터의 이동
	// unique_ptr<Object> obj1 = obj0; // 이렇게 쓰면 컴파일 에러! 아래와 같이 사용해야한다.
	std::unique_ptr<Object> obj1 = std::move(obj0);
	if (nullptr == obj0)
	{
		std::cout << "obj0 is empty" << '\n';
	}
	
	obj1->printData();

	// 값을 반환하는 함수로부터 유니크 포인터를 얻어온다.
	std::unique_ptr<Object> obj2 = ObjectFactory(2, "obj2Name");
	obj2->printData();


	// 잘 쓰이지 않는다.
	// 유니크 포인터 배열 할당
	std::unique_ptr<int[]> p = std::make_unique<int[]>(5);

	// 반복문을 통해 초기화 시켜줘야 한다.
	for (int i = 0; i < 5; ++i)
	{
		p[i] = i;
		std::cout << p[i] << ' ';
	}
}
obj0 : obj0Name
obj0 is empty
id : 0 , name : obj0Name
id : 2 , name : obj2Name
0 1 2 3 4

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

스마트 포인터 - std::weak_ptr  (0) 2022.03.23
스마트 포인터 - std::shared_ptr  (0) 2022.03.22
스마트 포인터 개요  (0) 2022.03.21
decltype  (0) 2022.03.17
auto의 형식 연역 규칙  (0) 2022.03.15

+ Recent posts