언리얼 스마트 포인터
스마트 포인터는 원시 포인터를 안전하고 효율적으로 사용하기 위해 만들어진 개념이다.
원시 포인터란 *를 통해 표현하는 것을 말한다.
이를 사용하면 댕글링 포인터나 이중 해제 등 문제가 발생할 수 있다.
예를 들어, 여러 곳에서 하나의 객체를 가리키고 있었다고 가정해 보자.
중간에 이 객체가 쓰임을 다해 소멸을 시켰다고 한다면 이를 가리키고 있는 모든 포인터가 유효하지 않는 값을 가리키고 있게 되는 것이다.
만약 이를 인지하지 못하고 사용한다면 엉뚱한 주소의 값을 변경하거나 런타임 에러가 발생할 수 있다.
이를 방지하기 위해 만들어진게 스마트 포인터이다.
스마트 포인터 타입
언리얼에서는 C++의 스마트 포인터를 사용하여 새로운 스마트 포인터를 만들어 제공한다.
- Shared Pointer(TSharedPtr): 쉐어드 포인터는 참조하는 오브젝트를 소유하며, 무기한으로 오브젝트의 소멸을 방지하고, 더 이상 참조가 없을 경우에는 오브젝트를 소멸시킨다.
- Shared Reference(TSharedRef): 쉐어드 레퍼런스는 참조하는 오브젝트를 소유하지만, null이 불가능한 오브젝트를 참조해야 한다. 따라서, null이 아닌 게 보장되며 쉐어드 포인터로 변환할 수 있다.
- Weak Pointer(TWeakPtr): 위크 포인터는 참조하는 오브젝트를 소유하지 않기 때문에 생명 주기에 영향을 주지 않는다. 하지만, 언제든지 null이 될 수 있다. 따라서, 위크 포인터를 사용할 때 체크해야 한다.
- Unique Pointer(TUniquePtr): 유니크 포인터는 참조하는 오브젝트를 유일하고 명시적으로 소유한다. 즉, 소유권을 이전할 수 있지만 공유할 수는 없다. 또한, 유니크 포인터가 스코프(Scope)를 벗어나게 되면, 참조하는 오브젝트가 자동 소멸된다.
헬퍼 클래스와 함수
- MakeShared: TSharedPtr을 만든 헬퍼 함수, 인스턴스없이 바로 만들 수 있다.
- MakeShareable: TSharedPtr을 만든 헬퍼 함수, 인스턴스가 필요하다. 하지만, 삭제자를 지정할 수 있다는 장점이 잇다.
// 비효율적 : new 로 할당 한 번, MakeShareable 로 할당 또 한 번!
MakeShareable(new MyClass());
// 효율적 : 할당을 한 번에!
MakeShared<MyClass>();
- StaticCastSharedRef: TSharedRef으로의 형변환
- StaticCastSharedPtr: TSharedPtr으로의 형변환
- ConstCastSharedRef: const 스마트 레퍼런스를 mutable 스마트 레퍼런스 변환
- ConstCastSharedPtr: const 스마트 포인터를 mutable 스마트 포인터로 변환