ComputerScience & Embedded/OS

Dangling Pointer vs Null Pointer

leecrossun 2022. 5. 16. 17:31

운영체제 힙 메모리 관리를 공부하다가 Dangling(Wild) Pointer에 대한 개념을 발견했는데

Null Pointer과 어떤 점이 다른지 궁금해서 찾아보았다.

 

우선 Garbage Collection을 사용하는 Java와는 다르게 C++의 경우는 개발자가 수동적으로 delete를 하여 힙 메모리를 반납한다.

그래서 개발자가 메모리를 늦게 해지하거나 아예 해지하지않고 둘 경우 메모리 누수(memory leak)이 발생할 수 있다.

그렇다고 너무 일찍 반납해버리면 댕글링 참조(Dangling Pointer)가 발생한다.

여기서 댕글링참조는 복잡한 프로그램에서 개발자가 실수로 함수나 변수가 나중에 사용될 것을 예측하지 못한 채 메모리를 반납해버린 경우에 발생한다. 즉, 포인터가 이미 해지된 메모리를 참조하게 되는 상황을 의미한다.

 

여기서 널 포인터(Null Pointer)개념이란 뭐가 다를까 의문이 들었다.

Null == 비어있다 니까 결국 같은 의미가 아닌가?

우선 댕글링 포인터란 포인터가 이미 해지되어 아무것도 없는 상태를 의미한다.

아래와 같이 아무것도 초기화하지 않은 상태도 해당된다.

int *dangling_pointer;

 

그러나 널포인터란 포인터가 아무것도 가리키지 않는 상태가 아니다.

NULL인 공간을 가리키고 있다.

이처럼 NULL을 가리키는 것을 명시하여 Dangling pointer가 되는 것을 방지할 수 있다.

int *null_pointer = NULL

아래 코드와 같이 NULL을 가리키고 있음을 명시하고 프로그래머가 이를 활용한다면

error handling을 하기가 수월해진다.

include<stdio.h>
include<stdlib.h>

int main()
{
    int *piNull = NULL;
    piNull = malloc(sizeof(int)*10);
    
    if(piNull == NULL)
    {
    	// error handling
    } else
    {
    	// use Data
        free(piNull); // free after the use
    }
    return 0;
}
반응형