포인터
A.1) 스마트 포인터 (Smart Pointer)
A.1.1) 정의
스마트 포인터는 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 주는 기능을 제공합니다.
A.1.2) 사용하는 이유
C++ 에서 new 키워드로 동적 메모리를 할당하면, 반드시 delete 키워드로 해당 메모리를 해제해야 합니다.
하지만 이를 놓치면 메모리 누수(memory leak) 가 발생할 수 있고, 프로그램의 안정성이 떨어지게 됩니다.
이를 방지하기 위해 C++은 스마트 포인터를 제공하여 메모리 관리를 자동화합니다.
A.1.3) 동작 방식
new키워드로 생성된 기본 포인터(raw pointer)를 스마트 포인터에 대입합니다.- 스마트 포인터가 소멸될 때, 내부 소멸자가 자동으로
delete를 호출하여 메모리를 해제합니다. - 따라서 개발자가 직접
delete를 호출할 필요 없이 안전하게 사용할 수 있습니다.
A.2) 스마트 포인터의 종류
unique_ptrshared_ptrweak_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;
}