안녕하세요
, 전 성주님이 작성free에 대해서 질문하고 싶은데요 포인터 a가 있다고 가정하고 malloc시키고 free(a)를 하면 a가 가리키는 대상은 어디인가요?? 구글링하니까 null은 아니라고 하면 동적메모리는 아닐거같고 참 궁금합니다
회신: 안녕하세요
, 도장_ 관리자님이 작성free 함수는 포인터로 할당한 메모리를 반환합니다.
할당을 해제한 메모리에 다시 접근하는 것은 가능하지만, 예기치 않는 오류가 발생하게 됩니다. 이는 메모리를 해제했다고 해제된 공간을 "0"으로 채우거나 지우는 작업을 하지 않기 때문입니다(비효율의 문제).
그래서 메모리만 반환하고 나머지는 그대로 둡니다. 이런 상태에서 다시 접근해 문제를 일으키는 것을 댕글링 포인트 문제(dangling pointer)라고 합니다. "매달려 있는 포인터 문제" 정도로 해석할 수 있습니다.
방어적인 프로그래밍에서는
free(a);
a = NULL;
처럼 해제한 후에 반드시 NULL로 설정하라고 합니다. NULL로 설정한 포인터에 접근하면 오류가 발생하고, 프로그램이 중단되므로 문제가 생긴 지점을 쉽게 알 수 있기 때문입니다.
메모리를 해제한 이후에 접근하는 것의 동작은 C 언어 명세에 정의되어 있지 않습니다. UB(Undefined Behavior, 정의되지 않은 동작)입니다.