c++ 댕글링 포인터 (허상 포인터) 참조 변수에 데이터가 이상할경우

포인터 변수에 들어있는 변수에 값이 변경 되는경우를 말한다
원본 참조 하고있는변수가 메모리 해제 되거나 아니면 다른변수값으로 변경 되는 경우이다.
보통 발생하는경우는 해제된 메모리의 재참조, 변수의 유효 범위 이탈, 함수안에 지역 변수이다
나같은 경우는 작업을 하다가 함수안에 지역 변수를 참조 하려다가 문제 상황이 발생했다.
매니저 변수에 필요한 데이터를 저장 하고 다른 클래스에서 불러서 값을 찾는 함수였는데
지역변수를 리턴해가지고 생기는 문제 였다.
위에 보이는 예시 상황 들을 먼저 한개식 서술 해보겠다.
int* ptr = new int(10);
std::cout << "할당된 값: " << *ptr << std::endl; // 출력: 10
delete ptr; // 메모리 해제
std::cout << "해제 후 값: " << *ptr << std::endl; // 쓰레기 값
int* create_integer() {
int local_var = 123;
return &local_var;
}
int main() {
int* dangling_ptr = create_integer();
// dangling_ptr은 이미 사라진 local_var의 주소를 가리킵니다.
printf("댕글링 포인터 값: %d\n", *dangling_ptr); // 쓰레기 값
}
int* ptr = nullptr;
{
int num = 5;
ptr = #
std::cout << "블록 안: " << *ptr << std::endl; // 출력: 5
} // 이 중괄호가 끝나는 순간 num은 사라집니다.
std::cout << "블록 밖: " << *ptr << std::endl; // 쓰레기 값
내가 한 경우는 2번인데
처음에는 std:map<int, std::map<int, 구조체>> 같은 변수형을 가진 타입에서 key 값 2개로 찾는거였다
근데 이게 안전성을 위해서 점점 함수를 변경 했다.
처음엔 구조체를 리턴하는거로 하려가 참조 형식의 * 포인터를 달아서 리턴하는걸로 했다
함수 자체도 find를 2번 하는 구조이고 그와중에 랜덤을 또 뽑아야해서 문제가 생겼던 것이다.
마지막엔 const 도 추가 된상태이다.
제일 중요한 방지법이다.
해제하면 nullptr 바꾸고 써야할때는 if ( 변수 == nullptr) return; 방지를 하자.
이것만 해도 문제를 확인 하고 처리를 할수있고 또한 이상한 상황을 방지할수있다.
지역 변수의 주소를 반환 금지
지역변수의 주소는 넘기지 말자 그냥 원본 데이터의 주소값을 넘기는게 제일 좋다.
스마트 포인터를 사용
C++11 이상을 사용하신다면 댕글링 포인터와 메모리 누수 문제를 방지 할수있다.
물론 사용하는쪽에서는 1번 처럼 체크는 해주는것이 제일 좋다.
방어적으로 하면 보다 좋은 방지가 될것이다.