포인터

A.1) 스마트 포인터 (Smart Pointer)

A.1.1) 정의

스마트 포인터는 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 주는 기능을 제공합니다.

A.1.2) 사용하는 이유

C++ 에서 new 키워드로 동적 메모리를 할당하면, 반드시 delete 키워드로 해당 메모리를 해제해야 합니다. 하지만 이를 놓치면 메모리 누수(memory leak) 가 발생할 수 있고, 프로그램의 안정성이 떨어지게 됩니다. 이를 방지하기 위해 C++은 스마트 포인터를 제공하여 메모리 관리를 자동화합니다.

A.1.3) 동작 방식

  1. new 키워드로 생성된 기본 포인터(raw pointer)를 스마트 포인터에 대입합니다.
  2. 스마트 포인터가 소멸될 때, 내부 소멸자가 자동으로 delete를 호출하여 메모리를 해제합니다.
  3. 따라서 개발자가 직접 delete를 호출할 필요 없이 안전하게 사용할 수 있습니다.

A.2) 스마트 포인터의 종류

  • unique_ptr
  • shared_ptr
  • weak_ptr

A.2.1) unique_ptr

  • 특정 객체에 대해 하나의 스마트 포인터만 소유권을 가질 수 있도록 설계된 스마트 포인터입니다.
  • 객체의 소유권을 가진 unique_ptr만이 해당 객체를 삭제할 수 있습니다.
  • 복사는 불가능하지만, move() 함수를 이용하면 소유권 이전은 가능합니다.
    • 소유권이 이전되면 기존의 unique_ptr은 해당 객체를 더 이상 관리하지 않습니다.
  • 일반적인 상황에서는 보통 unique_ptr이 가장 많이 사용됩니다.
  • 객체 생성 시에는 make_unique() 함수를 사용하는 것이 권장됩니다.
#include <iostream>
#include <memory>
using namespace std;
 
int main() {
    unique_ptr<int> ptr01(new int(5)); // int형 unique_ptr 선언 및 초기화
    auto ptr02 = move(ptr01);          // ptr01에서 ptr02로 소유권 이전
 
    // unique_ptr<int> ptr03 = ptr01;  // 복사는 불가능 → 오류 발생
 
    ptr02.reset();                     // ptr02가 관리하던 메모리 해제
    ptr01.reset();                     // ptr01도 nullptr 상태로 초기화
 
    return 0;
}