작성
·
102
0
안녕하세요 교수님.
교수님의 12강 강의를 수강 중에 UE의 UObject 메모리 관리에 대해 궁금한 점이 있어 질문 드리게 됐습니다.
"UPROPERY 지정을 통해 GC에 의해서 관리되는 UObject가 회수되지 않도록 한다."
라고 저는 이해했는데 맞게 이해한 것일까요?
만약 그렇다면 해당 메모리는 항상 Heap에 잔류한다고 봐도 될까요? 더 이상 필요 없어진 UObject라서 메모리에서 삭제하고 싶다면 어떻게 진행해야 하는 것인지 궁금합니다.
답변 2
0
안녕하세요.
고전적인 C++의 객체 메모리 관리는 new와 delete 조합을 사용해 진행되는데 이 경우에는 조금이라도 실수라도 하면 프로그램이 뻗는 큰 문제가 발생 합니다.
그래서 최신 객체지향 언어들은 가비지 컬렉션 이라는 관리 모델을 도입해서 문제를 방지하도록 설계되어 있습니다.
언리얼 엔진은 C++ 런타임 기반에서 자체적으로 제작한 가비지컬렉션 모델을 구동하고 있습니다. 이 시스템은 UObject 대상으로 동작합니다.
가비지컬렉션은 레퍼런스 카운팅이라 불리는 참조 정보를 기반으로 더 이상 오브젝트가 사용 되는지 안 사용 되는지를 체크 합니다. 더 이상 사용되지 않으면 메모리에서 자동으로 해지합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
OliveGr님의 질문은 Unreal Engine의 UObject에 관한 메모리 관리와 UPROPERTY
매크로의 작동 원리에 대한 깊은 이해를 요구합니다. 답변 드리자면, OliveGr님께서 말씀하신 부분이 큰 틀에서는 맞습니다. Unreal Engine에서 UPROPERTY
매크로를 사용하여 UObject 포인터에 표시하는 것은 이 객체가 가비지 컬렉터(GC)에 의해 자동으로 회수되지 않도록 합니다. 이는 GC 시스템이 해당 객체를 “사용 중”으로 인식하게 만들기 때문입니다.
하지만 이것은 해당 UObject가 영원히 메모리에 남아있다는 의미는 아닙니다. UPROPERTY로 선언된 객체는 해당 객체가 더 이상 참조되지 않는다고 판단될 때, 즉 다른 객체에 의해서 더 이상 필요로 되지 않을 때 가비지 컬렉터에 의해 정리될 수 있습니다. 여기서 중요한 것은 UObject가 어떻게 “필요로 되지 않는다”고 판단되는가입니다.
가비지 컬렉터는 특정 시점에 실행되어 메모리 내의 UObject 인스턴스들에 대한 참조를 분석하고, 더 이상 필요하지 않은(즉, 어디에서도 참조되지 않는) 객체를 메모리에서 해제합니다. 따라서, 더 이상 사용되지 않는 UObject를 메모리에서 직접 삭제하는 것이 아니라, 그 객체가 어디에서도 참조되지 않도록 관리하는 것이 중요합니다.
메모리에서 객체를 명시적으로 삭제하고자 할 때는 그 객체에 대한 모든 참조를 제거해야 하며, 이는 포인터를 nullptr
로 설정하거나, 컨테이너에서 객체를 제거하는 등의 방식으로 수행됩니다. Unreal Engine의 가비지 컬렉션 시스템이 다음번 순회 때 해당 객체를 회수할 수 있도록 합니다.
이러한 메모리 관리 메커니즘에 대한 자세한 설명은 “UPROPERTY()를 이용한 댕글리 포인터 문제 해결 질문”에서 찾아볼 수 있습니다. 이 답변에서는 UPROPERTY
매크로의 중요성과 가비지 컬렉션에 대한 상세한 설명이 제공되어 질문에 대한 이해를 돕습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다