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