* 정의
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 |