free() 함수 사용시 NULL하는 습관을 가지자!!!
개발/프로그래밍2008. 7. 24. 20:18
728x90
#define xfree(p) assuredfree(&p)
void assuredfree(void **p) {
free(*p);
*p=NULL;
}
int main() {
void *p;
p = (void*)malloc(100);
printf("%p\n", p);
xfree(p);
printf("%p\n", p);
}
Q 7.21 왜 free()를 부른 다음에 포인터가 널이 되지 않는 걸까요?
Answer free()를 부르면 이 함수에 전달된 포인터가 가리키고 있던 메모리가 해제됩니다.
그러나 이 포인터 자체의 값은 변경되지 않고 남아있습니다.
왜냐하면 C 언어는 인자를 전달할 때, ‘pass-by-value’ 개념을 쓰기 때문입니다.
따라서 함수가 (이 경우 free()) 인자로 전달된 변수의 값을 변경할 수 없습니다.
(질문 4.8을 참고하기 바랍니다.)
일단 해제된 포인터 값은 엄밀히 말해서, 유효하지 않습니다(invalid).
그리고 (dereference가 아니더라도) 어떠한 목적으로
(심지어, 단순히 대입하거나 비교하는 것도) 이 값을 쓰는 것은,
물론 구현 방법에 따라 다르긴 하지만, 이론상 문제를 발생할 수 있습니다.
(물론, 대부분의 시스템이 문제가 없어 보이는 invalid 포인터 쓰임새를 너그럽게 봐
주지만, 표준은 확실하게, 어떤 것도 보장될 수 없다고 말합니다.
또한 어떤 시스템은 구조상 이런 exception 상황이 흔히 발생합니다.)
728x90
댓글 영역