Search
Duplicate

댕글링 포인터(Dangling Pointer)

간단소개
댕글링 포인터는 무엇일까?
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
포인터
9 more properties

댕글링 포인터

libft 과제를 진행하며 여러 함수에서 동적 할당을 사용하였고 그와 관련해 댕글링 포인터라는 키워드를 알게 되었습니다. 동적 할당된 영역을 free 하고도 포인터가 여전히 해제된 메모리 영역을 담고 있다면 이것을 댕글링 포인터라 칭합니다.
댕글링 포인터는 메모리 접근시 예측 불가능한 동작이나 segmentation fault, 잠재적인 보안 위험에 대한 문제를 야기 할 수 있어 그 결과로 메모리 해제 된 메모리에 접근하거나 의도치 않은 포인터를 반환하게 됩니다
간단한 예시를 통해 같이 알아보겠습니다
#include <stdlib.h> #include <stdio.h> void main() { int *ptr = (int * )malloc(sizeof(int)); *ptr = 5; printf(" ptr: %d\n", *ptr); free(ptr); *ptr = 50; printf(" before_null_ptr: %d\n", *ptr); }
C
복사
ptr를 free 해준 뒤, 역참조를 시도하면 어떻게 될까요? malloc으로 할당된 heap 메모리 영역을 제외 했을뿐 담겨진 주소는 사라지지 않기 때문에 아래와 같이 역참조 된 값이 출력되는 일이 발생할 수 있습니다.
free 이후에 역참조를 시도하였는데 값이 변함
이러한 문제점을 해결 하는 가장 간단한 방법은 더 이상 접근 할 수 없도록 댕글링 포인터에 NULL 값을 설정해주는 것 입니다 그 외 free 보다 나은 함수를 사용 하는 등의 방법도 존재합니다 아래는 간단하게 NULL 값을 주어 처리한 예시 입니다.
#include <stdlib.h> #include <stdio.h> void main() { int *ptr = (int * )malloc(sizeof(int)); *ptr = 5; printf(" ptr: %d\n", *ptr); free(ptr); *ptr = 50; printf(" before_null_ptr: %d\n", *ptr); ptr = NULL; *ptr = 500; printf(" after_null_ptr: %d\n", *ptr); }
C
복사
NULL 초기화 이후 더 이상 역참조 되지 않습니다
#include <stdlib.h> #include <stdio.h> void main() { int *ptr = (int * )malloc(sizeof(int)); int *ptr2; *ptr = 5; ptr2 = ptr; printf("\n ptr: %d\n", *ptr); printf(" ptr2: %d\n\n", *ptr2); free(ptr); *ptr = 50; printf(" ptr: %d\n", *ptr); printf(" ptr2: %d\n\n", *ptr2); ptr2 = NULL; *ptr = 500; printf(" ptr: %d\n", *ptr); printf(" ptr2: %d\n\n", *ptr2); ptr = NULL; printf(" ptr: %d\n", *ptr); printf(" ptr2: %d\n", *ptr2); }
C
복사
위 코드에서 출력 되는 값은 몇개일까요?