2015년 5월 21일 목요일

free시킨 포인터 변수에는 NULL로 초기화 해주자! 댕글링 포인터(Dangling Pointer)

아래 코드를 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int *= (int*)malloc(sizeof(int));
 
    *= 10;
    printf("%d\n"*p); // 10
 
    free(p);
    *= 20;
    return 0;
}
 
 
cs


이상한 점이 보이는가?
free(p)를 통해 동적할당된 메모리 공간을 해제시키고 나서 *p = 20; 과 같이
없어진 공간을 또 사용하고 있다.


이와 같이 free시켜 해제된 메모리 공간을 가리키고 있는 포인터 변수를 보고
댕글링 포인터(Dangling Pointer) 라고 한다.


위와 같이 사용한다면 당장 눈에 보이는 에러가 발생하지는 않지만 프로그램이 동작하는 도중 free한 위치에 새로 동적할당이 이루어져 중요한 정보가 저장되어 버린다면 심각한 문제가 발생할 수 있다.


그렇기 때문에 위와 같은 문제를 해결하기 위해 습관적으로 free이후 해당 포인터 변수에 NULL값을 넣어주는 것이 좋다.


만약 귀찮다면 아래와 같이 매크로 함수를 작성하여 사용하는 것도 좋은 방법이다.


1
2
3
4
5
#define FREE(x) do { free(x); x=NULL; } while(0)
 
...
FREE(p);
...
cs


위와 같이 free후 NULL 값을 넣어주는 매크로 함수 FREE를 작성하여 사용하면 더 편리하게 댕글링 포인터를 예방할 수 있다.


(만약 위 매크로 함수에 do while문을 사용하는 이유가 궁금 하면 아래 게시글을 확인하라)
http://grindawayat.blogspot.kr/2015/05/do-while.html

댓글 없음:

댓글 쓰기