운영체제 힙 메모리 관리를 공부하다가 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;
}
반응형
'ComputerScience & Embedded > OS' 카테고리의 다른 글
프로세스의 상태 - 프로세스 관리 (Process Management) (0) | 2021.07.08 |
---|---|
운영체제 작업수행방식 - 일괄처리/시분할/분산처리/병렬처리/실시간 시스템 (0) | 2021.07.07 |
컴퓨터 시스템 - 운영체제와 하드웨어 (0) | 2021.07.07 |