programing

널 포인터 해제

javamemo 2023. 9. 12. 19:48
반응형

널 포인터 해제

NULL을 가리키고 있는 포인터를 해제하려고 하면 메모리 내부에서 어떤 일이 발생합니까? 그것이 유효한 적이 있습니까?

경고/오류 메시지가 표시되지 않는 이유는 무엇입니까?

C99 섹션 7.20.3.2 : 무료 기능

시놉시스

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

묘사

2 free function은 ptr이 가리킨 공간을 할당 해제, 즉 추가 할당을 위해 사용할 수 있도록 합니다.ptr이 null 포인터이면 작업이 발생하지 않습니다.

http://linux.die.net/man/3/malloc 에서:

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

아주 오래 전에 null 포인터를 free로 주면 충돌하는 'free()' 구현이 있었습니다.이는 C89(C90) 표준의 이전 날짜를 가진 구현에만 적용되며, 이후 문제를 해결하기 위해 수정되지 않았습니다.

제 경험으로는 기본적으로 이러한 구현이 전혀 남아 있지 않으며(그리고 있어서도 안 됩니다), 이제 널 포인터를 자유롭게 사용할 수 있습니다.

아주 이상하고 오래된 시스템에 이식해야 하는 요구사항이 있다면, 여전히 조심해야 할 것입니다.반면에, 걱정해야 할 시스템이 있다면, 여러분은 아마도 이 문제(그리고 여러 가지 다른 문제)에 대해 알고 있거나, 코드에 대한 공동 지식이 있을 것입니다.

저는 다음과 같습니다.

#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS
    #define safe_free(x) do { if ((x)) free((x)); } while(0)
#elseif /* feeling gutsy */
    #define safe_free(x) free((x))
#endif

;-||

null 포인터를 해제해도 실행에 영향이 없습니다.

NULL을 가리키고 있는 포인터를 해제하려고 하면 메모리 내부에서 어떤 일이 발생합니까?

아무 것도 없어요.

경고/오류 메시지가 표시되지 않는 이유는 무엇입니까?

첫째, 동작은 정의상 유효하므로 오류나 경고를 발행할 필요가 없습니다.

둘째, 포인터가 런타임 시 NULL을 가리킵니다.경고 또는 오류 메시지가 표시되는 경우에는 어떻게 표시해야 합니까?Kill the Zombie(좀비 죽이기)라는 게임을 하고 있는데 두 존재가 공격하는 동안 "Warning, NULL 포인터가 해제되었습니다"라는 팝업 오류 메시지가 나타납니다.

안전할 수도 있지만(나는 몰랐지만, 다른 대답들은 그것을 암시하는 것 같습니다), 포인터가 이미 널(null)인지는 신경 쓰지 않는 습관에 빠지지 않을 것입니다.과제를p = NULL;모든 자유 시간이 지나면 곧 결과로 이어집니다.다중 스레드 응용 프로그램에서 이는 위험합니다. 이 과제 이후에,p다른 스레드에서 사용될 수 있으며 다른 스레드에서 활성 상태로 예상되는 동안 현재 스레드에서 다시 해제됩니다.

모든 말록의 기억은 한 번 해방되어야 합니다.마침표.

언급URL : https://stackoverflow.com/questions/2354658/freeing-a-null-pointer

반응형