원시포인터를 사용하지 않길 원하면서 C++코드에서 수동으로 UObject 파생이 아닌 오브젝트를 추적하고 삭제하는 상황에 TSharedPtr, TSharedRef같은 스마트 포인터가 좋은 후보이다.
TSharedPtr :
1. 쓰레드로부터 안전한 참조 카운터 포인터 타입으로 공유 오브젝트를 나타낸다.
-> 두 번째 파라미터를 ESPMODE::ThreadSafe를 전달한 경우
2. 공유 오브젝트는 더 이상 참조가 없을 때 할당 해제된다.
TAutoPtr
1. 쓰레드로부터 안전하지 않은 공유 포인터
C++ 원시포인터를 가져다가 TSharedPtr, TSharedRef, TWeakPtr, TAutoPtr중 하나에 해당하는 생성자 호출로 포장하면 된다.
ex)
//UObject에서 파상되지 않은 C++ 클래스
class MyClass { };
TSharedPtr<MyClass> sharedPtr(new MyClass());
weak pointer와 shared pointer의 차이
weak pointer는 참조 카운터 0으로 내려갈 때 오브젝트를 지우지 않고 유지하는 기능이 없다.
weak pointer(원시 포인터 사용)를 사용하면, weak pointer아래 있는 오브젝트를 수동으로 삭제하면 weak pointer의 참조는 NULL이 된다.
ptr.IsValid()를 통하여 포인터가 유효한지 검사를 할 수 있다.
공유 포인터는 쓰레드로부터 안전하다.
-> 이는 기본 오브젝트를 별도의 쓰레드에서 안전하게 조작할 수 있다는 의미
TSharedRef는 UObject또는 UObject 파생에서 사용 불가하며, 커스텀 C++클래스에서만 사용 가능
FStructure는 TSharedPtr, TSharedRef, TWeakPtr 클래스를 사용해 원시 포인터를 감쌀 수 있다.
스마트 포인터를 사용하여 오브젝트를 가리키려면 TWeakObjectPointer 또는 UPROPERTY()를 사용해야 한다.
TSharedPtr의 쓰레드 안전성을 보장하지 않아도 된다면 TAutoPtr을 사용할 수 있다. TAutoPtr은 참조의 수가 0으로 떨어지면 자동으로 오브젝트를 지운다.
'Unreal Engine 4 > Unreal Engine 4' 카테고리의 다른 글
UPROPERTY()와 언리얼의 가비지 컬렉션 시스템 (0) | 2022.03.21 |
---|---|
TScopedPointer (0) | 2022.03.21 |
UObject 파생 클래스를 제거하는 방법 (3) | 2022.03.16 |
Actor 클래스와 UObject에서 파생된 클래스의 인스턴스화 (0) | 2022.03.14 |
UE4 예상 되는 클래스 타입을 지정하는 다양한 방법 (1) | 2022.03.14 |