이론적으로 나는 말할 수 있습니다
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 *)0
및 delete[] (void *)0
C ++에있는 법률.
BTW, 메모리를 두 번 해제하면 일반적으로 일종의 런타임 오류가 발생하므로 아무것도 손상시키지 않습니다.
