memory_unique_ptr

memory_unique_ptr (std::unique_ptr)

<memory> 헤더에 정의되어 있어요. new를 통해 할당된 객체를 삭제자(deleter)로 관리하고, unique_ptr이 파괴되면 객체를 파괴하는 스마트 포인터예요. 공유되지 않고 독점 소유권을 가지며, 복사가 아닌 이동만 가능해요. C++11부터 도입됐어요.

출처: cppreference

본문

template< class T, class Deleter = std::default_delete<T> >
class unique_ptr;          // (1) since C++11
template< class T, class Deleter >
class unique_ptr<T[], Deleter>;   // (2) 배열 특수화

std::unique_ptrnew(또는 make_unique 등)를 통해 할당된 객체의 소유권을 독점적으로 관리하는 스마트 포인터예요. unique_ptr 객체가 소멸되면 삭제자로 객체를 삭제해요. 복사할 수 없고 오직 이동(move)만 가능해서, 소유권이 하나의 unique_ptr에만 있음이 보장돼요.

배열 특수화 unique_ptr<T[]>operator[]로 인덱스 접근을 제공하고 delete[]로 해제해요.

멤버 타입

  • pointer: Deleter::pointer가 있으면 그것, 아니면 T*
  • element_type: T
  • deleter_type: Deleter

멤버 함수

  • (생성자): 새 unique_ptr 생성 (기본, 포인터에서, 이동 등)
  • (소멸자): 관리 객체를 삭제자로 파괴
  • operator=: 이동 대입. null 포인터·raw 포인터 대입
  • get: 저장된 포인터 반환
  • get_deleter: 삭제자 반환
  • operator bool: 비-널인지
  • reset: 관리 객체 재설정
  • release: 소유권을 해제하고 포인터 반환
  • swap: 두 unique_ptr 교환
  • operator*/operator->: 역참조
  • operator[] (배열 특수화): 인덱스 접근

예제

#include <iostream>
#include <memory>

struct Foo { Foo(int v) : val(v) {} int val; };

int main()
{
    std::unique_ptr<Foo> p = std::make_unique<Foo>(42);
    std::cout << (*p).val << '\n';       // 42
    std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
    arr[0] = 10;                         // 배열 인덱스 접근
}

주의 (Notes)

  • unique_ptrstd::shared_ptr과 달리 소유권을 공유하지 않아서 복사가 금지돼요.
  • T는 불완전 타입일 수 있지만, 관리 객체를 파괴하는 소멸자·reset·operator=는 완전 타입일 때만 사용 가능해요.
  • 커스텀 삭제자를 지정해 new가 아닌 다른 방식(예: 배열, 파일 등)으로 얻은 자원도 RAII로 관리할 수 있어요.

더 알아보기 (Learn more)

cppreference