[c++] 스마트 포인터를 사용 해보자

TNT·2026년 1월 25일

c++ 기초

목록 보기
19/19

요즘에는 c++ 에서 기본적으로 포인터 관련으로 처리를 해주긴 하지만 오래된 프로젝트나 또는 예전부터 쓰이던 코드에서는 포인터로 관리를 한다 이럴때 개선이나 추가로 들어가는 코드들이있는데

기존 코드랑 관련해서 문제 생기던가 사람 실수로 delete 이중 delete 등등 이런 관리 문제로 실수나는게 존재한다.

이런거를 막기 위해서 c++ 11부터 스마트 포인터가 나왔는데

포인터 처럼 동작 하지만 delete를 자동으로 관리를 해준다

unique_ptr

사용할경우

{
    std::unique_ptr<int> ptr = std::make_unique<int>(10);
} // scope를 벗어나면 자동으로 delete

기본적으로 스코프가 끝나는 순간, 자동으로 메모리 해제
예외가 발생해도 안전 (RAII = Resource Acquisition Is Initialization)
RAII 에 대한 설명

사용 안할경우

int* p = new int(10);

// 중간에 return이나 exception 발생
delete p; // 호출 안 되면 메모리 누수

unique_ptr 을 사용할경우에는 복사할수도 없고 이동만 가능하고 1개의 변수에서만 사용할수있어서 목적지가 명확하다
shared_ptr이 필요하지 않다면 unique_ptr을 쓰면 된다.

shared_ptr

unique_ptr과는 다르게 shared_ptr은 공동으로 소유 하는 객체이다.

std::shared_ptr<int> ptr1 = std::make_shared<int>(10);
std::shared_ptr<int> ptr2 = ptr1;

std::cout << ptr1.use_count(); // 2

참조된 카운트를 기록하고있고 여러 객체가 하나의 자원을 공유 가능하다

하지만 이거는 좀 문제가 있는데 참조 카운트 관리 비용랑 순환 참조가 발생할수도 있다.

기본적으로는 unique_ptr을 기반으로 사용하고 사실 간단한 참조만 하고 해제 할경우 { } 으로 묶어주면 될꺼같다

profile
개발

0개의 댓글