강의

멘토링

로드맵

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

충실한 전복님의 프로필 이미지
충실한 전복

작성한 질문수

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

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

FGCObject 상속 받은 객체에서 Uobject 삭제를 원할 때

해결된 질문

작성

·

18

0

강의를 보면 UPROPERTY 를 사용할 수 없는 일반 C++ 객체 내부의 UObject 를 상속받은 객체의 경우 C++ 객체에 FGCObject 를 상속받고 AddReferencedObjects 함수를 통해 가비지에 UObject 에 상속받은 객체를 선언하는 식으로 하여 가비지의 개입을 막는 것으로 보이는데요.

 

 

다만 이때 이럴 경우가 없겠지만

C++ 클래스 생성자에서 UObject 를 상속받은 객체를 생성 후

C++ 클래스 소멸자에서 UObject 를 상속받은 객체를 삭제하고 싶다면

저는 소멸자에서 무언가를 할 필요는 없는지요?

C++ 객체 가 삭제되면 가비지는 알아서 그 안에 있는 UObject 들을 모두 알아서 메모리를 회수 하는지 궁금합니다.

더불어서 C++ 클래스 내에서 n 개의 UObject 를 상속받는 객체를 관리한다면, 모두 AddReferencedObjects 에 등록하면 되는지도 궁금합니다.

마지막으로 예를 들면 UMyGameInstance 에서 UPROPERTY() 를 선언한 UObject 를 상속받은 객체 A 가 있다면 이를 FStudentManager 에 포인터로 넘겨서 FStudentManager 내에서 A 에 대한 무언가 관리를 한다면
A 는 이미 외부(UMyGameInstance ) 에서 UPROPERTY() 를 선언하였으니 FStudentManager ->AddReferencedObjects 를 통해서 등록할 필요는 없는지 궁금합니다.

답변 2

0

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

네 가비지 컬렉터의 주요 목적은 소멸자에서 무언가 안해도 되게끔해서 생산성을 높이기 것이기에 딱히 소멸자 로직은 신경안쓰셔도 됩니다.

언리얼 소스 코드를 보면 관련 예제들이 있으니 참고하시면 좋을 것 같아요. 특히 UI쪽이 이를 많이 사용합니다.
FStudentManager 입장에서는 A가 언제 소멸될지 알 수 없기에 언리얼 오브젝트를 쓴다면 규칙을 주어진 규칙을 따라주는게 좋습니다.
주신 질문들은 좋은 내용인데, 직접 간단한 예제를 만들어 테스트해보면서 소스코드의 동작을 체크해주시면 실력 향상에 많은 도움이 될 것 같습니다.~

0

안녕하세요, 인프런 AI 인턴입니다. 충실한 전복님.

질문하신 내용은 언리얼 엔진에서 FGCObject를 활용한 가비지 컬렉션 관리 방식과, UObject의 수명 주기에 관한 것입니다. 이를 구체적으로 설명드리겠습니다.

  1. C++ 객체 소멸자에서의 작업: C++에서 FGCObject를 상속받으면, 정말로 메모리를 수동으로 관리할 필요는 없습니다. 언리얼 엔진의 가비지 컬렉션 시스템은 FGCObject의 객체에서 참조를 추가하고, 외부 참조가 없는 경우 이를 자동으로 정리합니다. 즉, C++ 클래스의 소멸자에서 직접 UObject를 삭제할 필요는 없습니다. 가비지 컬렉터가 이를 담당하게 됩니다.

  2. AddReferencedObjects 함수 역할: C++ 객체에서 여러 개의 UObject를 관리해야 한다면, 모든 UObject를 AddReferencedObjects 함수 내에서 참조로 등록해야 합니다. 이를 통해 가비지 컬렉션 시스템이 해당 UObject들이 여전히 참조되고 있다는 것을 알 수 있게 하여, 의도치 않게 메모리가 회수되는 것을 방지하게 됩니다.

  3. UPROPERTY가 선언된 경우: UMyGameInstance 내에서 UPROPERTY로 선언된 UObject가 이미 적절히 관리되고 있다면, 추가로 FStudentManager에서 AddReferencedObjects 함수를 통해 등록할 필요가 없습니다. 이미 UPROPERTY를 통해 Unreal의 리플렉션 시스템과 가비지 컬렉터가 해당 객체를 추적하고 있기 때문입니다. 따라서 FStudentManager에서는 이 객체를 단순히 사용만 하시면 됩니다.

관련하여 언리얼 엔진의 가비지 컬렉션과 UPROPERTY의 사용에 대해 더 깊이 이해하는 데 도움이 되는 링크를 추천드립니다:
- FGCObject 상속 받은 객체에서 메모리 관리 방법: 이 링크에서는 FGCObject를 통해 객체를 관리하고 메모리를 해제하는 시점에 대해 다룹니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

충실한 전복님의 프로필 이미지
충실한 전복

작성한 질문수

질문하기