메모리를 자동으로 관리하는 포인터. 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 |
