[c] ptr이 NULL 인 free (ptr)는 메모리를 손상 시킵니까?

이론적으로 나는 말할 수 있습니다

free(ptr);
free(ptr); 

이미 해제 된 메모리를 해제하기 때문에 메모리 손상입니다.

하지만 만약

free(ptr);
ptr=NULL;
free(ptr); 

OS가 정의되지 않은 방식으로 동작하기 때문에 무슨 일이 일어나고 있는지에 대한 실제 이론적 분석을 얻을 수 없습니다. 내가 무엇을하든,이 메모리 손상이 아닌가?

NULL 포인터를 해제하는 것이 유효합니까?



답변

7.20.3.2 free기능

개요

#include <stdlib.h> 
void free(void *ptr); 

기술

free함수는에서 가리키는 공간을 ptr할당 해제, 즉 추가 할당에 사용할 수 있도록합니다. 경우 ptr널 포인터가 아무런 조치가 발생하지 않습니다.

ISO-IEC 9899를 참조하십시오 .

즉, 야생에서 다른 코드베이스를 살펴보면 사람들이 다음과 같이하는 것을 알 수 있습니다.

if (ptr)
  free(ptr);

이것은 NULL포인터를 해제 할 때 일부 C 런타임 (PalmOS의 경우 였음을 확실히 기억합니다)이 충돌하기 때문 입니다.

하지만 요즘 free(NULL)은 표준의 지시에 따라 nop 라고 가정하는 것이 안전하다고 생각합니다 .


답변

모든 표준 호환 버전의 C 라이브러리는 free (NULL)를 no-op으로 처리합니다.

즉, 한때 free (NULL)에서 충돌하는 free 버전이 있었기 때문에 방어적인 프로그래밍 기술이 권장하는 것을 볼 수 있습니다.

if (ptr != NULL)
    free(ptr);


답변

ptr이 NULL이면 작업이 수행되지 않습니다.

문서를 말합니다.


답변

free(NULL)충돌이 발생한 PalmOS에서 작업 한 것을 기억 합니다.


답변

free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

NULL 포인터를 안전하게 삭제할 수 있습니다. 이 경우 아무 작업도 수행되지 않습니다. 즉, free ()는 NULL 포인터에 대해 아무 작업도 수행하지 않습니다.


답변

권장 사용법 :

free(ptr);
ptr = NULL;

보다:

man free

     The free() function deallocates the memory allocation pointed to by ptr.
     If ptr is a NULL pointer, no operation is performed.

당신은 포인터 설정하면 NULL이후에 free()호출 할 수 free()다시에를 아무런 작업이 수행되지 않습니다.


답변

free(NULL)완벽하게 C에 대한 법률뿐만 아니라입니다 delete (void *)0delete[] (void *)0C ++에있는 법률.

BTW, 메모리를 두 번 해제하면 일반적으로 일종의 런타임 오류가 발생하므로 아무것도 손상시키지 않습니다.