인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

themoon007님의 프로필 이미지
themoon007

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

12강 언리얼 엔진의 메모리 관리

UObject 타입과 가비지 콜렉션 질문

작성

·

97

0

UObject 를 상속한 멤버이기 때문에 가비지 콜렉터로 관리가 되는 건지,

 

아니면 TObjectPtr<> 로 인해 가비지 콜렉터로 관리되는 건지 궁금합니다.

 

 

멤버가 TObjectPtr<UObject>이 아닌 UObject* 타입으로 되있을 때도 가비지 콜렉터가 작동되서 UPROPERTY() 를 붙이지 않는 한 자동으로 지워지는 건가요??

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

원래 언리얼 4에서는 UObject*로 사용했습니다. 하지만 언리얼 5로 들어오면서 관리적인 이슈로 포인터 선언이 아닌 TObjectPtr을 사용하도록 권장하고 있습니다.
사실 언리얼 5에서 이전 4문법인 포인터를 사용해도 문제가 없어보이지만, 아무래도 권장사항대로 해야겠지요?
정리하면 TObjectPtr이 가비지컬렉터의 주요 조건은 아니고 UPROPERTY 매크로가 담당한다고 이해해주시면 되겠습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용은 Unreal Engine에서 UObject와 가비지 컬렉션의 관계, 그리고 UPROPERTY()의 중요성에 대한 것으로 이해됩니다. Unreal Engine에서는 UObject를 상속 받은 객체들이 가비지 컬렉터에 의해 관리되며, UPROPERTY 매크로를 사용하여 Unreal Engine의 가비지 컬렉션 시스템이 해당 객체를 추적하도록 명시하는 것이 일반적인 관행입니다.

제공된 정보에서 가장 먼저 주목할 부분은 “UPROPERTY()를 이용한 댕글리 포인터 문제 해결 질문” (링크)입니다. 이 답변에서는 UObject 포인터 멤버 변수에 UPROPERTY()를 붙여야 하는 이유가 설명되어 있습니다. 가비지 컬렉터(GC)가 참조를 추적할 수 있도록 하여 UObject의 인스턴스가 스윕(sweep) 과정에서 삭제되지 않도록 하는 것입니다. 즉, UPROPERTY()를 선언한 포인터 멤버 변수는 가비지 컬렉터에 의해 추적되며, 이는 UObject가 댕글리 포인터(dangling pointer, 유효하지 않은 메모리 주소를 참조하는 포인터)가 되는 것을 방지합니다.

질문하신 내용에 관련하여, TObjectPtr<> 사용과 가비지 컬렉션의 관계도 관련이 깊습니다. “TArray에서 TObjectPtr 사용시 지정자 필수” (링크)에서, UObject의 포인터를 관리할 때 가비지 컬렉션에 의해 회수되지 않도록 하기 위해 UPROPERTY()가 필요함이 강조되어 있습니다. 이는 TObjectPtr을 사용할 때에도 마찬가지로 적용됩니다.

요컨대 UObject를 상속 받은 객체나 TObjectPtr를 사용할 때, 해당 객체가 가비지 컬렉션에 의해 안전하게 관리되려면 UPROPERTY()를 사용해야 함이 분명해집니다. UObject* 타입의 멤버가 가비지 컬렉션에 올바르게 관리되기 위해서는 이를 UPROPERTY() 매크로로 명시해 줘야 합니다. UPROPERTY()를 사용하지 않을 경우, 가비지 컬렉션 시스템이 해당 포인터의 존재를 인식하지 못하여 예기치 않게 메모리에서 객체가 삭제될 위험이 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

themoon007님의 프로필 이미지
themoon007

작성한 질문수

질문하기