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

작성자

Posted by 일퍼센트

관련 글

댓글 영역