본문 바로가기

CS 지식

[C++] 스마트 포인터

1. 스마트 포인터

동적 메모리 관리를 단순화하는 도구다. 기본 포인터와는 다르게, 자동으로 메모리를 해제하여 메모리 누수를 방지한다. 

#include <memory>

int main()
{
	std::unique_ptr<int> smart_ptr(new int(10));
    //메인 함수 끝나고 smart_ptr 사라질 때 메모리도 자동 해제
	return 0;
}

 

2. 사용 이유

int* ptr = new int(10); //메모리 할당
delete ptr; //메모리 해제

일반 포인터는 메모리 동적 할당 시 꼭 해제를 해줘야 하는데, 해제를 하지 않으면 메모리는 시스템에 계속 할당된 상태로 남게 된다. 이 경우 메모리 누수가 생겨 메모리 사용량이 증가하고, 시스템의 성능을 저하시킨다.

int* ptr = new int(10);
delete ptr;
*ptr = 20; //잘못된 해제 후 사용 (dangling pointer)

이미 해제된 메모리를 계속 사용하려고 하는 경우 (dangling pointer), 데이터 손실이나 시스템 충돌을 일으킬 수 있다.

 

3. 작동 원리

메모리를 직접 관리하는 것이 아닌, RAII(Resource Acquisition Is Initialization)원칙을 사용해 메모리를 자동으로 관리한다.

객체의 수명이 그 객체가 소유한 자원의 수명과 동일하게 관리되는 원칙이다.

std::unique_ptr<int> smart_ptr(new int(10));
*smart_ptr = 20; //직접적으로 원시 포인터에 접근하는 것이 아닌, 스마트 포인터를 통해 메모리 접근

스마트 포인터는 내부적으로 원시 포인터 (raw pointer)를 보관하고 있다. 원시 포인터는 스마트 포인터가 가리키는 실제 메모리를 가리키고, 사용자는 직접 접근할 수 없다.

 

4. std::unique_ptr

스마트 포인터에는 많은 종류가 있지만, 그 중 unique_ptr에 대해 알아보고자 한다.

동일한 메모리를 가리키는 두 개의 unique_ptr 인스턴스가 동시에 존재할 수 없고, 스마트 포인터 하나에 메모리 하나만 할당 가능하다.

메모리 누수같은 일반적인 문제를 방지할 수 있고, 포인터의 소유권을 이동할 수 있다.

std::unique_ptr<int> ptr1(new int(5));
std::unique_ptr<int> ptr2 = ptr1; //복사는 허용되지 않음. 컴파일 에러
std::unique_ptr<int> ptr2 = std::move(ptr1); //이동은 허용.

 

'CS 지식' 카테고리의 다른 글

[C++] 정렬의 종류  (0) 2025.04.17
[C++] Name Mangling (Decoration)  (0) 2025.04.14
[C++] 이동 의미론 (Move Semantics)  (0) 2025.04.13
[C++] 포인터  (0) 2025.04.13
[C++] L-value, R-value  (0) 2025.04.13