본문 바로가기
C/[코드조선] C 핵심

[C] 와일드 포인터(Wild pointer) 댕글링 포인터(Dangling pointer)

by 묻공러 2023. 11. 21.

와일드 포인터(Wild pointer)

초기화하지 않아서 쓰레기 값이 채워져 있는 포인터를 의미한다

int *p1;// 와일드 포인터

// 해결 방법
int *p2 = nullptr;

// 해결 방법 (언리얼)
UPROPERTY()
int *p3;

 

언리얼에서는

언리얼 오브젝트의 속성을 정하는 UPROPERTY() 매크로 작성하면 자동으로 nullptr로 초기화가 된다

UPROPERTY() 매크로를 작성하지 않으면, 와일드 포인터가 발생할 수 있음에 유의해야 한다

 

 

댕글링 포인터(Dangling pointer)

해제된 메모리 영역을 가리키고 있는 포인터를 의미한다

int* p = new int(10);
delete(p)
*p = 100;// 댕글링 포인터
int* p = new int(10);
delete(p)
p = nullptr;// 해결 방법

 

언리얼에서는

nullptr로 예외처리를 하거나 유효성 검사를 하면 댕글링 포인터 문제가 발생할 수 있다

따라서, 언리얼에서 제공하는 IsValid() 함수로 유효성 검사를 하면 된다

UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
if (true == ::IsValid(EnhancedInputComponent))
{
	...
}

 

IsValid() 함수는 아래와 같은 검증과정을 거친다

FORCEINLINE bool IsValid(const UObject *Test)
{
	return Test && 
    FInternalUObjectBaseUtilityIsValidFlagsChecker::CheckObjectValidBasedOnItsFlags(Test);
    // nullptr인지 pending kill인지 garbage인지 3가지를 모두 체크
    // pending kill이란 오브젝트를 Destroy를 할 때 바로 사라지는 것이 아니라
    // pending kill이라는 플래그를 통해 곧 삭제될 오브젝트라는 것을 표시해둔 것
}