프로그래밍/언리얼

언리얼 스마트 포인터와 메모리 관리

태환차 2020. 5. 31. 23:29

스마트 포인터의 사용법은 일반 포인터와 거의 동일하다

 

일반 포인터는 객체에 접근가능한 주소를 보관하는 개념이라면

스마트 포인터는 객체의 소유권을 증명하는 개념이다

 

언리얼에서는 T로 시작하는 라이브러리로 제공한다

 

1. 유니크포인터(TUniquePtr)

 : 유일한 소유권을 보장한다. 공동 소유 불가

 

2. 공유포인터(TSharedPtr)

 : 공동 소유권을 주정할 수 있다

   내부적으로 레퍼런스 카운팅기법을 사용한다

   객체를 참조할 때마다 레퍼런스 카운트가 하나씩 올라가고, 해지하면 하나씩 내려간다

   레퍼런스카운트가 0이되면 자동으로 해당 객체를 소멸시킨다

   순환 참조(Circular Reference)가 발생할 수 있다

 

3. 약포인터(TWeakPtr)

 : 정보는 가지고 있지만, 소유권은 없는 형태이다

 

스마트 포인터 라이브러리는 일반 C++ 객체를 위한 라이브러리이기 때문에

언리얼 오브젝트에는 사용할 수 없다

 

언리얼 오브젝트는 언리얼 엔진 가상머신의

가비지 컬렉션(Garbage Collection)에 의해 자동으로 관리된다

 

언리얼 오브젝트가 GC에 의해 자동 관리되기 위해서는 선언에 반드시 UPROPERTY 매크로가 들어가야 한다

그럼 언리얼 엔진에 의해서 필요가 없어질 때 자동으로 회수된다

 

GC 시스템이 언리얼 오브젝트를 관리하는 방식은 공유 포인터와 거의 유사하지만, 

GC 시스템에 의해서 관리되기 때문에 메모리에서 해지되는 타이밍을 정확히 예측할 수 없다

 

가비지 컬렉션은 프로젝트 세팅에서 지정된 시간마다 언리얼 오브젝트를 감지해서 제거해준다