와일드 포인터(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이라는 플래그를 통해 곧 삭제될 오브젝트라는 것을 표시해둔 것
}
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] 연산자 (0) | 2024.02.02 |
---|---|
[C] 탈출 문자열(Escape Sequence)과 서식 지정자(Format Specifier) (0) | 2024.02.01 |
[C] 컴파일과 빌드 (0) | 2024.02.01 |
[C] Low-Level Language와 High Level Language (0) | 2024.02.01 |
[C] 기억부류 지정자 (0) | 2023.10.29 |