본문 바로가기

프로그래밍

Unreal Engine의 스마트 포인터 WeakObjectPtr, TSharedPtr, TObjectPtr 비교

728x90

Unreal Engine 5에서 객체를 참조하는 방법에는 여러 가지가 있습니다.

그중에서도 자주 사용되는 스마트 포인터 종류인 TWeakObjectPtr, TSharedPtr, TObjectPtr에 대해 알아보겠습니다.

 

TWeakObjectPtr

  • 목적: 객체에 대한 약한 참조를 제공하여, 객체의 생명주기를 안전하게 관리합니다.
  • 기능:
    • 객체에 대한 포인터를 저장하지만, 참조 카운트를 증가시키지 않습니다.
    • 순환 참조를 방지하고 메모리 누수를 줄여줍니다.
    • 참조하는 객체가 삭제된 경우 nullptr을 반환합니다.
  • 사용 시기:
    • 객체 소유권을 갖지 않고 단순히 참조만 할 때
    • 순환 참조를 피해야 할 때
    • 객체의 존재를 항상 보장할 필요가 없을 때

TSharedPtr

  • 목적: 객체에 대한 공유 소유권을 제공하여, 여러 곳에서 객체를 안전하게 참조하고 관리합니다.
  • 기능:
    • 객체에 대한 포인터를 저장하고 참조 카운트를 자동으로 관리합니다.
    • 새로운 TSharedPtr이 생성될 때 참조 카운트가 증가하고, 소멸될 때 감소합니다.
    • 참조 카운트가 0이 되면 객체를 자동으로 삭제합니다.
  • 사용 시기:
    • 여러 곳에서 객체를 공유해야 할 때
    • 객체의 생명주기를 길게 유지해야 할 때
    • 객체가 실수로 삭제되는 것을 방지해야 할 때

TObjectPtr

  • 목적: 일반적인 C++ 포인터와 유사하게 객체에 대한 직접적인 포인터를 제공합니다.
  • 기능:
    • 참조 카운트나 소유권 관리 기능이 없습니다.
    • 메모리 관리를 개발자가 직접 해야 합니다.
  • 사용 시기:
    • 성능이 중요한 부분에서 참조 카운트 오버헤드를 줄이고 싶을 때
    • 객체의 생명주기를 개발자가 완벽하게 제어해야 할 때
    • 레거시 코드나 특정한 상황에서 TSharedPtr이나 TWeakObjectPtr이 적절하지 않을 때

각 스마트 포인터의 주요 차이점

기능 TWeakObjectPtr TSharedPtr TObjectPtr
참조 카운트 없음 있음 없음
소유권 없음 공유 없음
안전성 순환 참조 방지 객체 안전하게 삭제 메모리 관리 필요
성능 일반적으로 TSharedPtr보다 빠름 참조 카운트 관리 오버헤드 가장 빠르지만 개발자 책임
 

어떤 스마트 포인터를 사용해야 할까요?

  • TWeakObjectPtr: 객체 소유권 없이 약한 참조가 필요할 때
  • TSharedPtr: 여러 곳에서 객체를 공유하고 안전하게 관리해야 할 때
  • TObjectPtr: 메모리 관리를 직접 제어하고 성능이 중요할 때
728x90