Skip to content

Std::unique ptr

컨테이너

지금까지는 좋다. 그러나 가희 혁명적이지는 않다. 내가 지금까지 설명하는 것을 하는 클래스를 작성하는 것은 사소한 일이고, 당신은 원래의 C++ 표준에서도 이것을 할 수 있었다. 사실 불운의 (지금은 폐기된) auto_ptr가 바로 그것이었고, RIAA 포인터 래퍼로서 첫번째 시도였다.

불운하게도, 언어는 auto_ptr가 올바르게 동작하는 데 까지는 발전하지 못했다. 결과적으로 당신은 그것을 약간 기초적인 것으로써 사용할 수 없다. 예를 들어, 당신은 auto_ptr 객체를 대부분의 컨테이너 안에 저장할 수 없다. 매우 큰 문제이다.

C++11은 우측값 참조와 이동의 의미를 추가함으로서 이 문제들을 해결했다. 결과적으로, unique_ptr 객체는 컨테이너 안에 저장될 수 있고, 컨테이너가 크기 조절이 되거나 이동될 때 올바르게 동작한다. 그리고 컨테이너가 소멸될 때 같이 소멸된다. 당신이 원하는 바와 같이.

Release

현재 소유한 인스턴스의 소유권을 해제 없이 놓고자 할때는 release라는 메소드를 사용합니다. 이 경우, 반환된 인스턴스를 직접 해제해 주어야 합니다.

Custom deleter

unique_ptr은 메모리의 할당에는 관여하지 않으면서 메모리의 해제를 수행합니다, 따라서 만약 메모리를 new가 아니라 malloc과 같이 다른 형태로 할당했다면 문제가 발생할 것입니다. 이때는 custom deleter를 구현해주어야 합니다.

아래는 malloc으로 할당하고 custom deleter를 통해 해제하는 예입니다.

struct my_free
{
    void operator()(void* x) { free(x); }
};

int main()
{
    unique_ptr<int, my_free> a((int*)malloc(sizeof(int)));
    return 0;
}

Favorite site

References


  1. DevStory_of_LunaStar_-item_18-_std_unqiue_ptr.pdf