해결된 질문
작성
·
49
0
ULCUserFacingExperience::CreateHostingRequest
함수를 설명하시면서 코드블럭 내에 NewObject로 선언한 객체가 GC의 대상이 된다고 하셨는데
언리얼의 NewObject함수는 템플릿 내의 자료형을 힙영역에 할당하는 방식이 아닌건가요?
물론 코드블럭을 벗어나면 스택에 올라가있는 NewObject로 받은 지역변수 포인터는 사라지겠지만 객체 자체가 스택에 남아있어 GC에게 감시되는 방식인지 궁금합니다.
답변 3
0
NewObject로 생성된 객체는 힙영역에 할당됩니다. 따라서 코드 블록을 벗어 나게 되면 객체 포인터는 사라지더라도 객체는 힙영역에 남아있게 됩니다. 그리고 힙에 저장된 UObject는 GC에 의해서 관리됩니다.
GC는 Root UObject(GC에 소멸되지 않음)와 연결되지 않은 UObject를 주기적으로 탐색 및 소멸 시킵니다.
GC의 동작 방식은 Root UObject 들로 부터 시작하는 UObject 참조 트리를 순회하며 UObject가 Root와 연결이 되어있는지 확인하는 방식으로 동작합니다.
자세한 내용은 공식 문서에서도 확인 가능합니다.
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-object-handling-in-unreal-engine
0
NewObject는 무조건 힙 영역에 할당하게 됩니다.
언리얼에서 GC의 조건은 힙 영역에 할당되었다는게 중요한게 아니라 다른 대상이 UPROPERTY로 선언된 변수를 통해 대상을 1명 이상 들고 있는지 여부가 중요합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 두루미의왕님.
언리얼 엔진에서 NewObject
함수는 일반적으로 객체를 힙 영역에 할당합니다. 이 객체는 언리얼 엔진의 가비지 컬렉터(GC)의 관리 하에 놓이게 되며, 이를 통해 메모리 관리를 자동으로 처리할 수 있습니다. NewObject
로 생성된 객체는 특정 조건이 충족되면 정리 대상이 되는데, 이는 언리얼의 가비지 컬렉션 시스템을 통해 가능하죠.
코드 블럭을 벗어나면 스택 메모리에 있던 변수가 제거되더라도, 힙에 남아 있는 객체는 여전히 언리얼 가비지 컬렉션 시스템에 의해 관리됩니다. 이 시스템은 객체에 대한 참조가 더 이상 없을 때 메모리를 적절히 해제해줍니다.
이와 관련하여 추가적인 설명을 참고할 수 있는 좋은 자료가 있습니다. 언리얼의 메모리 관리와 관련된 질문에 대한 유사한 답변을 확인해 보실 수 있습니다:
객체지향 질문있습니다: 이 질문에서는 객체 생성을 통해 메모리가 어떻게 할당되는지 설명하며, 언리얼과 C++에서의 차이점을 살펴볼 수 있습니다.
코드를 혼자 쳐보면서 질문이 생겨서 글 남겨요: 힙 메모리 할당과 관련한 더 깊이 있는 설명을 제공하고, NewObject의 동작 원리를 이해하는 데 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.