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_ptr은 new(또는 make_unique 등)를 통해 할당된 객체의 소유권을 독점적으로 관리하는 스마트 포인터예요. unique_ptr 객체가 소멸되면 삭제자로 객체를 삭제해요. 복사할 수 없고 오직 이동(move)만 가능해서, 소유권이 하나의 unique_ptr에만 있음이 보장돼요.
배열 특수화 unique_ptr<T[]>는 operator[]로 인덱스 접근을 제공하고 delete[]로 해제해요.
멤버 타입
pointer:Deleter::pointer가 있으면 그것, 아니면T*element_type:Tdeleter_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_ptr은std::shared_ptr과 달리 소유권을 공유하지 않아서 복사가 금지돼요.T는 불완전 타입일 수 있지만, 관리 객체를 파괴하는 소멸자·reset·operator=는 완전 타입일 때만 사용 가능해요.- 커스텀 삭제자를 지정해
new가 아닌 다른 방식(예: 배열, 파일 등)으로 얻은 자원도 RAII로 관리할 수 있어요.