관리 메뉴

기억을 위한 기록들

[UE] UObject 객체에 대해 참조 할때, TWeakObjectPtr<T> 템플릿 클래스 말고도, MakeWeakObjectPtr 함수가 있다. 본문

UnrealEngine

[UE] UObject 객체에 대해 참조 할때, TWeakObjectPtr<T> 템플릿 클래스 말고도, MakeWeakObjectPtr 함수가 있다.

에드윈H 2025. 6. 8. 16:35

언리얼엔진에서 UObject 객체들에 참조하려고 할 때, 유효성 검사하더라도 포인터만 남아서 문제가 생길 때가 있다.

 

UObject* CachedObject = GetSomeObject(); // 이 시점엔 유효
// ...
if (CachedObject) // 이게 true라도 실제 메모리는 이미 파괴되었을 수 있음
{
    CachedObject->DoSomething(); // 크래시 가능
}

 

혹은

 

FTimerDelegate TimerDel;
TimerDel.BindLambda([=]()
{
    MyObject->DoSomething(); // MyObject는 이미 GC에 의해 삭제됐을 수 있음 
});

이럴때의  TWeakObjectPtr<T> 템플릿으로 감싸서 IsValid 검사를 하며 사용할 수 있다.

 

객체가 유효할 때만 접근이 가능하고, GC가 객체를 수거하면 자동으로 무효화되기 때문에 소유하지 않는 참조를 안전하게 구현할 수 있습니다.

 

하지만 TWeakObjectPtr은 템플릿 타입이기 때문에 직접 만들 때 종종 실수할 수 있습니다. 이를 방지하기 위해 MakeWeakObjectPtr(Object) 함수를 제공하여 객체 타입을 추론하고, 간결하고 안전하게 TWeakObjectPtr을 생성할 수 있게 해 줍니다.

 

 

 

UObject* SomeUObject = GetSomeUObject();

// 직접 생성할 경우
TWeakObjectPtr<UObject> WeakA(SomeUObject);

// MakeWeakObjectPtr 사용
auto WeakB = MakeWeakObjectPtr(SomeUObject);

여기서 중요한 점은 플릿 타입을 명시하지 않아도 MakeWeakObjectPtr이 타입을 자동 추론해 준다는 것이다.

특히, 커스텀 객체 타입에서 실수하기 쉬운 부분을 줄여준다.

 

if (WeakB.IsValid())
{
    WeakB->DoSomething();
}

 

또한, TWeakObjectPtr은 다음처럼 유효성 검사도 쉽게 할 수 있습니다:

 

결국, MakeWeakObjectPtr은 단순한 함수 이상으로 큰 차이 없을 수 있겠지만 코드의 안정성과 가독성을 동시에 챙길 수 있는 실용적인 습관 중 하나가 될 수도 있다고 본다.