댕글링 포인터
프로그램이 더 이상 유효하지 않은 메모리 주소를 참조하는 포인터를 의미한다.
이는 메모리 안전성과 프로그램의 안전성을 저하시킬 수 있는 중요한 문제이다.
댕글링 포인터가 발생하는 주요 원인과 그 결과, 그리고 이를 방지하는 방법에 대해 알아보자
댕글링 포인터가 발생하는 주요 원인
I. 객체 해제 후 포인터 사용:
메모리 해제(삭제) 후에도 여전히 포인터가 해당 메모리를 가리키고 있는 경우,
해당 포인터는 더 이상 유효한 메모리를 참조하지 않게 된다.
이때 그 포인터를 댕글링 포인터라고 한다.
int* ptr = new int(10);
delete ptr; // 메모리 해제
*ptr = 20; // 댕글링 포인터 사용, 정의되지 않은 동작(UB)
II. 스택 메모리 참조:
함수가 반환된 후 스택에 할당된 지역 변수를 참조하는 포인터는 유효하지 않는다.
int* DanglingPointer() {
int localVar = 42;
return &localVar; // 스택 메모리 참조
}
int* ptr = DanglingPointer(); // ptr은 댕글링 포인터
III. 중복 해제:
동일한 메모리를 두 번 해제할 경우, 두 번째 해제 후 포인터는 댕글링 포인터가 된다.
int* ptr = new int(10);
delete ptr;
delete ptr; // 중복 해제, 정의되지 않은 동작(UB)
댕글링 포인터의 결과
- 정의되지 않은 동작 : 프로그램이 예상치 못한 동작을 하거나 충돌을 일으킬 수 있음
- 메모리 오염 : 잘못된 메모리 접근으로 인해 다른 변수나 데이터가 손상될 수 있다.
- 보안 취약점 : 댕글링 포인터를 악용하여 메모리 오버플로우 공격이나 다른 보안 취약점을 유발할 수 있음
댕글링 포인터 방지 방법
I. 포인터 초기화
포인터를 초기화하지 않거나 메모리를 해제한 후에도 다시 nullptr로 초기화하여 안전성을 확포한다
int* ptr = new int(10);
delete ptr;
ptr = nullptr; // 포인터 초기화
II. 스마트 포인터 사용
C++의 스마트 포인터 (std::unique_ptr, std::shared_ptr, std::weak_ptr)를 사용하여
자동 메모리 관리를 한다
std::unique_ptr<int> ptr = std::make_unique<int>(10);
// 자동으로 메모리 해제
III. Unreal Engine에서의 댕글링 포인터 관리
TObjectPtr는 UObject와 함께 사용되며, 가비지 컬렉션 시스템을 통해 댕글링 포인터 문제를 방지한다.
TObjectPtr<MyClass> MyObjectPtr = NewObject<MyClass>();
정리
댕글링 포인터는 더 이상 유효하지 않은 메모리를 참조하는 포인터로,
프로그램의 안전성을 저하시킬 수 있는 주요 문제이다.
이를 방지하기 위해 초인터 초기화, 스마트 포인터 사용,
그리고 TObjectPtr와 같은 안전한 포인터 타입을 사용하는 것이 중요하다.
'Etc.' 카테고리의 다른 글
내가 찾아보고 공부해봐야 하는 키워드 정리 (0) | 2024.07.16 |
---|---|
[C++] 포인터 (0) | 2024.05.17 |
[C++] Class (0) | 2024.05.13 |
BaekJoon 1931 문제에서.. (0) | 2024.04.09 |
[C++] Vector와 Deque (0) | 2023.09.26 |