[기술 질문] #11_허상 포인터(Dangling Pointer)
허상 포인터에 대해 알아보겠습니다.
Overview
- 개념
- 발생 원인
#0. 개념
1. 허상 포인터??
- 허상 포인터는 유효한 객체를 가리키고 있지 않은 포인터를 의미합니다.
- 주로 객체 파괴 시 발생하는 문제로 객체에 대한 참조가 포인터 값에 대한 수정 없이 삭제되거나, 할당 해제되어 포인터가 지속적으로 할당 해제된 메모리 영역을 가리킬 때 발생합니다.
- 허상 포인터에 역참조할 시 예측 불가능한 동작으로 정의되며, 잠재적 보안 오류를 갖고 있습니다.
#1. 발생 원인
1. 얕은 복제
int main()
{
ClassA class1(3);
// 디폴트 복사 생성자 사용
ClassA class2(class1);
delete class1;
// Dangling Pointer 발생!!
class2.PrintNumber();
}
Details
- 얕은 복사가 Dangling Pointer의 발생 원인들 중 하나입니다.
- 얕은 복사는 클래스의 디폴트 복사 생성자를 활용해 원본 객체의 피상적인 주소 값 혹은 참조 값을 복사합니다. 원본객체의 데이터 멤버가 갖는 참조 값이 복사되어, 복사된 객체의 데이터 멤버는 같은 메모리 영역을 참조하게 됩니다. 이때, 원본 객체의 소멸과 함께 참조하는 메모리 영역도 함께 해제되어, 복사된 객체의 데이터 멤버는 이미 할당 해제된 빈 메모리 영역을 가리키게 됩니다!
2. 유효 범위의 종료
int* SomFunc(int num)
{
int* ptr = #
return ptr;
}
int main()
{
int num = 2;
int* resPtr = SomFunc(num);
cout << *resPtr << endl;
return;
}
Details
- 유효 범위가 이미 종료되어 메모리 할당이 해제된 변수를 가리키는 포인터는 결과적으로 비어 있는 메모리 영역을 가리키게됩니다.
'언어 > 기술 질문' 카테고리의 다른 글
[기술 질문]#13_6가지 디폴트 멤버 메서드 (0) | 2023.03.05 |
---|---|
[기술 질문]#12_함수 포인터, Function Pointer (0) | 2023.02.22 |
[기술 질문]#10_실수형의 문자열 변환 (0) | 2023.02.18 |
[기술 질문]#9_부동 소수점, float (0) | 2023.02.18 |
[기술 질문]#9_객체 지향 프로그래밍(OOP) (0) | 2023.02.12 |