UObject와 일반 C++ 데이터는 소유권 규칙이 다르다
GC가 따라가는 UObject 참조와 RAII로 관리하는 Non-UObject 데이터를 먼저 구분해야 메모리 회수 판단이 섞이지 않는다.
| 대상 | 수명 규칙 | 좋은 사용 | 위험 신호 |
|---|---|---|---|
| UObject | GC가 참조 그래프를 검사 | Actor, Component, Asset처럼 엔진 객체로 관리 | 참조가 남아 회수되지 않음 |
| UPROPERTY 참조 | GC가 강한 참조로 추적 | 소유해야 하는 UObject 포인터 표시 | 누락 시 예기치 않은 회수 |
| TWeakObjectPtr | 소유하지 않고 유효성만 확인 | 캐시, 관찰자, 임시 접근 | 검사 없이 역참조 |
| Non-UObject | RAII와 스마트 포인터 사용 | 버퍼, 순수 C++ 구조체, 외부 리소스 | new/delete 수동 관리 |
| 에셋·풀 | 로드/반납 정책 필요 | 반복 생성 비용을 풀링으로 제한 | 풀 크기 증가와 스트리밍 지연 |
메모리 문제는 먼저 어느 세계의 수명 규칙을 따르는지 분리한 뒤 추적한다.