[C/C++] Dangling Pointer란 무엇일까?

댕글링 포인터(Dangling Pointer) 란 무엇일까? 막상 이름만 들었을 땐 귀엽지만, 잘못하면 문제를 발생시키기 쉬운 녀석이다. 원인은 다음과 같다.

1. 동적 할당(힙에 할당) 된 메모리가 존재.
2. free or delete를 통해 삭제
3. 삭제된 메모리를 가르키고 있는 상태.

코드 상 예를 들자면 다음과 같다.

 /* 할당 */ char *str = (char)malloc(sizeof(char) * 4); strcpy(str, "test");

/* str 작업...*/ printf("str[%s]\n", str);

/* 해제 */ free(str);

/* str 재사용 */ if ( str ) { printf("%p str %p is Not Null [%s]\n", &str, *str, str); }

/* 기대값으로, str이 가르키는 값은 해제되었기에 if문을 타지 않겠지? */ /* 허나 수행해버리고 종료되어버린다. */







무슨 말인고...?

1. A 할당

= A에 대한 문자열 첫번째에 대한 주소값을 가진다.

2. A 해제
= A에 대해 주소값을 여전히 가진다.


이 과정에서 NULL로 초기화 해주는 소스코드가 들어가야한다.

/* 할당 */ char *str = (char)malloc(sizeof(char) * 4); char *ptr = str;

/* str 작업...*/

/* 해제 */ free(str); str = NULL;

/* 해제 후엔 꼭 가르키는 주소값(포인터)을 Null로 초기화를 하자 */

/* 재사용 */ if ( str ) { printf("%p str %p is Not Null [%s]\n", &str, *str, str); }




댕글링 포인터가 많아지면 디버깅이 어려워지기에 잘 확인하여야한다.
다음은 다른 포인터 변수에 넣는 경우이다.



 int main(void) { char *str = (char*)malloc(sizeof(char)*5); memset(str, '\0', sizeof(char) * 5);

strcpy(str, "test"); printf("%s\n", str);

/* 1. 초기화 전 할당 */ char* ptr = str; free(str);

/* 2. Null로 초기화 */ str = NULL;

/* 3. ptr 주소값의 Null 검사 */ if ( ptr ) // ptr은 값을 가짐. *ptr로 검사시 타지 않는다. { printf("%p ptr %p is Not Null [%s]\n",&ptr, *ptr, ptr); }

if ( str ) { printf("%p str %p is Not Null [%s]\n", &str, *str, str); }

/* 4. 출력 ? */ printf("%p str %p is Not Null [%s]\n", &str, *str, str);

return 0; }


단계 별로 풀어서 해보자...

1. 초기화 전 할당.





2. Null 로 초기화





3. str, ptr 주소값의 Null 검사





/* 4. 출력 ? */ printf("%p str %p is Not Null [%s]\n", &str, *str, str);

return 0; }

4. 4. 출력의 경우 해제되었고, 주소 값도 Null로 바뀌었기에 세그멘테이션 폴트로 종료되어버린다.

항상 초기화 및 포인터 검사에 대해 생각하지 않으면,
디버깅시 굉장히 헷갈리게 될 거 같다.



댓글

이 블로그의 인기 게시물

[로스트아크] 제작 효율 최적화 위한 영지 세팅

[로스트아크] 로스트아크 생활 도구 옵션

한국 핵무장 논의와 방위산업 관련주: 핵무기 개발 과정과 유망 종목 분석