본문 바로가기
프로그래밍/c++

unique_ptr(스마트포인터)

by 오늘의논리 2024. 1. 22.
728x90

전세계에 하나만 존재해야 하는애를 unique_ptr 관리해야 합니다. 그래서 보통 매니저 클래스 같은걸 unique_ptr 하는경우가 많습니다.

 

unique_ptr은 C++에서 스마트 포인터라고 부르는 특별한 종류의 포인터입니다. 스마트 포인터는 동적으로 할당된 객체의 수명을 자동으로 관리해주는 포인터로, 일반적인 포인터와 달리 delete를 직접 호출할 필요가 없습니다. unique_ptr은 스마트 포인터 중에서도 하나의 객체를 단독으로 소유하고, 복사나 대입이 불가능한 포인터입니다. unique_ptr은 다음과 같은 장점이 있습니다.

  • 객체의 수명을 범위(scope)에 맞춰서 자동으로 관리해줍니다. unique_ptr이 소멸되면, 가리키는 객체도 함께 소멸됩니다.
  • 불필요한 복사를 방지하고, 이동 시맨틱(move semantic)을 지원합니다. 이동 시맨틱은 객체의 자원을 다른 객체로 이동하는 기법으로, 복사보다 효율적이고 빠릅니다.
  • 순환 참조(cyclic reference) 문제를 해결합니다. 순환 참조란, 서로가 서로를 가리키는 포인터들이 존재하여 객체의 수명이 끝나지 않는 현상입니다. unique_ptr은 다른 unique_ptr과 공유할 수 없기 때문에, 이런 문제를 방지할 수 있습니다.

unique_ptr은 <memory> 헤더에 정의되어 있으며, 다음과 같은 방법으로 생성할 수 있습니다.

// make_unique 함수를 사용하여 객체를 동적 할당하고 unique_ptr로 감싼다. (C++14부터 지원)

std::unique_ptr<int> p1 = std::make_unique<int>(10);

// 기존의 포인터를 unique_ptr로 변환한다.int* p2 = newint(20);
std::unique_ptr<int> p3(p2);

// 다른 unique_ptr을 이동한다.std::unique_ptr<int> p4 = std::move(p1); // 이동 생성자p3 = std::move(p4); // 이동 대입 연산자

  • unique_ptr::unique_ptr: 생성자
  • unique_ptr::~unique_ptr: 소멸자
  • unique_ptr::operator=: 대입 연산자
  • unique_ptr::reset: 포인터를 재설정하거나 해제한다.
  • unique_ptr::swap: 다른 unique_ptr과 교환한다.
  • unique_ptr::get: 원시 포인터를 반환한다.
  • unique_ptr::release: 원시 포인터를 반환하고 소유권을 포기한다.
  • unique_ptr::operator*: 객체에 대한 참조를 반환한다.
  • unique_ptr::operator->: 객체에 대한 포인터를 반환한다.
  • unique_ptr::operator bool: 포인터가 비어있는지 확인한다.

 

 

다른예제)

 

int main()
{

    unique_ptr<Knight> k(new Knight());
    unique_ptr<Knight> s = k;//불가) 복사와 관련된 부분은 다 막혀있음
    unique_ptr<Knight> s = std::move(k); //이동은 가능

}
728x90

'프로그래밍 > c++' 카테고리의 다른 글

weak_ptr(스마트 포인터)  (0) 2024.01.22
shared_ptr(스마트포인터)  (0) 2024.01.22
알고리즘  (0) 2023.03.06
set, multimap, multiset  (0) 2023.03.04
map  (0) 2023.03.04

댓글