메모리를 자동으로 관리하는 포인터. TSharedPtr, TWeakPtr, TUniquePtr. 수동 delete 불필요.

 

왜 스마트 포인터를 사용하는가?

// Raw 포인터의 문제
void SpawnEnemy() {
    Enemy* enemy = new Enemy();
    if(somethingFailed) return;  // 메모리 누수! delete 안 됨
    // 예외 발생해도 delete 안 됨
    delete enemy;  // 개발자가 직접 기억해야 함
}

// 스마트 포인터
void SpawnEnemy() {
    auto enemy = std::make_unique<Enemy>();
    if(somethingFailed) return;  // 자동 해제. 누수 없음
    // 예외 발생해도 자동 해제
}   // 스코프 벗어나면 자동 delete

핵심은 RAII원칙. 리소스 획득을 초기화 시점에 하고, 소멸자에서 자동 해제, 개발자가 delete를 기억할 필요가 없다

 

스마트 포인터 3종류 ( 소유권(Ownership)이 핵심 )

 

소유권이란? -> 이 객체의 수명을 누가 책임지는가

 

unique_ptr : 나만 소유. 하나만ㅁ 존재

shared_ptr : 여럿이 공동 소유. 마지막이 해제

weak_ptr : 소유 없음. 그냥 참조만

 

unique_ptr - 단독 소유 ( 소유자가 명확히 하나일 때 )

// 하나의 소유자만 존재
std::unique_ptr<Enemy> enemy = std::make_unique<Enemy>();

// 복사 불가 — 소유권이 둘로 나뉘면 안 됨
auto enemy2 = enemy;          // 컴파일 에러

// 이동은 가능 — 소유권 이전
auto enemy2 = std::move(enemy); // enemy는 nullptr이 됨

// 스코프 벗어나면 자동 해제

 

shared_ptr - 공동 소유 ( 여러 오브젝트가 같은 리소트를 공유할 때. 텍스처, 사운드, 공유 데이터 등 )

// 참조 카운트로 수명 관리
std::shared_ptr<Texture> tex = std::make_shared<Texture>();
// refCount = 1

{
    std::shared_ptr<Texture> tex2 = tex;
    // refCount = 2
}   // tex2 소멸 → refCount = 1

// tex 소멸 → refCount = 0 → 자동 해제

 

weak_ptr - 소유 없는 참조 ( 순환 참조가 생길 수 있는 곳. 관찰자 역할)

// 순환 참조 문제
class Player {
    std::shared_ptr<Enemy> target;  // Player→Enemy 소유
};
class Enemy {
    std::shared_ptr<Player> attacker; // Enemy→Player 소유
    // 서로 소유 → 둘 다 refCount 0이 안 됨 → 메모리 누수
};

// weak_ptr로 해결
class Enemy {
    std::weak_ptr<Player> attacker;  // 소유 없이 참조만
    void Attack() {
        if(auto p = attacker.lock()) {  // 아직 살아있으면
            p->TakeDamage(10);
        }
    }
};

 

UE5의 스마트 포인터와 차이점

 

표준 C++ 스마트 포인터

- std::unique_ptr, std::shared_ptr, std::weak_ptr

- UObject가 아닌 일반 C++ 클래스에 사용

- UObject에는 사용 금지

 

UE5 스마트 포인터

- TUniquePtr, TSharedPtr, TWeakPtr

- UObject가 아닌 UE5 클래스에 사용. GC(Garbage Collection)와 독립적

- UObject에는 사용 금지

 

UObject 전용 Reference

- TObjectPtr<T> : 강한 참조. UPROPERTY와 함께 GC에 등록

- TWeakObjectPtr<T> : 약한 참조. GC가 제거해도 nullptr로 자동 변환

- TSoftObjectPtr<T> : 에셋을 필요할 때만 로드하는 지연 참조

 

연결되는 단어들

 

RAII : 스마트 포인터의 기반 원칙. Resource 획득 = 초기화, 소멸자 = 자동 해제.

 

참조 카운팅 ( Reference Counting ) :  shared_ptr의 내부 동작. 참조가 0이 되면 자동 해제.

 

GC vs RAII : GC는 런타임이 주기적으로 수거, RAII는 스코프 벗어나는 즉시 해제. UE5는 UObject에 GC, 일반 C++에 RAII      병행해서 사용

 

댕글링 포인터 ( Dangling Pointer ) : 해제된 메모리를 가리키는 포인터. weak_ptr/TWeakObjectPtr로 방지.

'Word' 카테고리의 다른 글

DirectX/ Direct3D  (0) 2026.07.08
OpenGL ( Open Graphics Library )  (0) 2026.07.07
SOLID 원칙  (0) 2026.07.06
나라티브 디자인 ( Narrative Design )  (0) 2026.07.06
수직 슬라이드 ( Vertical Slice )  (0) 2026.07.02

+ Recent posts