programing

여기서 ptr은 NULL이 파손된 메모리인 free(ptr)가 됩니까?

kingscode 2022. 7. 10. 19:13
반응형

여기서 ptr은 NULL이 파손된 메모리인 free(ptr)가 됩니까?

이론상으로는 그렇다고 말할 수 있다

free(ptr);
free(ptr); 

이미 해방된 메모리를 해방하고 있기 때문에, 메모리 파손이 발생하고 있습니다.

하지만 만약

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

OS는 정의되지 않은 상태로 동작하기 때문에 실제의 이론적인 분석을 얻을 수 없습니다.내가 뭘 하고 있든 간에, 이 메모리 파손이야, 아니야?

NULL 포인터를 해방할 수 있습니까?

7.20.3.2free기능.

개요

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

묘사

free함수는 에 의해 지적된 공간을 야기한다.ptr할당 해제, 즉 추가 할당에 사용할 수 있도록 합니다.한다면ptr는 늘 포인터이며 액션은 발생하지 않습니다.

ISO-IEC 9899 를 참조해 주세요.

그러나 야생의 다양한 코드베이스를 보면 사람들이 다음과 같은 행동을 하는 것을 알 수 있습니다.

if (ptr)
  free(ptr);

이는 일부 C 런타임(Palm의 경우로 확실히 기억함)이 있기 때문입니다.OS)를 해제하면 크래쉬가 발생합니다.NULL포인터

하지만 요즘엔 안전하다고 생각해요free(NULL)표준에서 지시하는 nop입니다.

모든 표준 준거 버전의 C 라이브러리는 무료(NULL)를 no-op으로 취급합니다.

단, 한때 무료(NULL)로 크래시되는 무료 버전이 몇 가지 있었기 때문에 다음과 같은 방어적 프로그래밍 기술이 권장될 수 있습니다.

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

free(ptr)C에 저장됩니다.ptrNULL하지만, 대부분의 사람들이 모르는 것은NULL0일 필요는 없습니다.구식의 좋은 예가 있습니다.C64의 주소 0에는 IO-Port가 있습니다.이 포트에 액세스하는 C에 프로그램을 작성했다면 값이 0인 포인터가 필요합니다.대응하는 C 라이브러리는 0과 0을 구별해야 합니다.NULL그리고나서.

안부의 말.

메모리 파손이 아니라 동작은 구현에 따라 달라집니다.기준으로는 법적 코드여야 합니다.

free(NULL)C뿐만 아니라 C에서도 완전히 합법적이다.delete (void *)0그리고.delete[] (void *)0C++에서는 합법입니다.

메모리를 2회 해방해도, 통상, 런타임 에러가 발생하기 때문에, 아무것도 파손되지 않습니다.

Palm에서 작업했던 게 기억나요.OS의 위치free(NULL)충돌했다.

ptr이 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()다시 켜면 작업이 수행되지 않습니다.

ptr은 메모리 위치를 가리키고 있습니다.예를 들어 0x100 입니다.

프리(ptr)를 사용하면 기본적으로 메모리 매니저가 0x100을 다른 액티비티나 프로세스에 사용할 수 있습니다.간단히 말하면 자원 할당 해제입니다.

ptr을 할 때=NULL, ptr이 새로운 위치를 가리키고 있습니다(NULL이 무엇인지 걱정하지 마십시오).이렇게 하면 0x100 메모리 데이터의 트랙이 손실됩니다.이게 메모리 누수입니다.

따라서 ptr=는 사용하지 않는 것이 좋습니다.유효한 ptr의 NULL입니다.

대신 다음 명령을 사용하여 안전 검사를 수행할 수 있습니다.

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

ptr가 이미 NULL을 가리키고 있는 경우 free(ptr)는 동작하지 않습니다.그렇게 하는 것이 안전합니다.

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

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

언급URL : https://stackoverflow.com/questions/1938735/does-freeptr-where-ptr-is-null-corrupt-memory

반응형