문제

예를 들어:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);

이 작업을 수행하면 부작용이 있나요?

도움이 되었습니까?

해결책

다음은 장과 구절입니다.

인수가 [ free 함수]는 이전에 반환 된 포인터와 일치하지 않습니다. calloc, malloc, 또는 realloc 기능 또는 공간이 전화로 처리 된 경우 free 또는 realloc, 행동은 정의되지 않습니다. (ISO 9899 : 1999- 프로그래밍 언어 - c, 섹션 7.20.3.2)

다른 팁

아무것도, 무성 메모리 손상 또는 세분화 결함 중 하나입니다.

예, 프로그램이 충돌하게하는 이중 무료 오류가 발생할 수 있습니다. 할당 된 메모리를 추적하기 위해 Malloc의 내부 데이터 구조와 관련이 있습니다.

답변 요약 :

그렇습니다. 나쁜 일은 아마도 일어날 수 있습니다.

이를 방지하기 위해 :

free(myString);
myString = NULL;

메모리에 대한 모든 참조는 NULL 다른 사람들이 만들어 졌다면.

또한 전화 free() a NULL 결과가 없습니다. 자세한 내용은 다음을 참조하십시오. 남자 무료

그렇게 영리하지 않습니다. 이중 무료 취약점을위한 Google. 포인터를 설정하십시오 NULL 그러한 버그를 피하기 위해

어떤 시스템을 실행하는지에 따라 아무 일도 일어나지 않으면 프로그램이 충돌하거나 메모리가 손상되거나 다른 수많은 흥미로운 효과가 있습니다.

해방 후 항상 NULL에 대한 포인터를 설정하십시오. Null 포인터를 풀려는 것이 안전합니다.

자동으로이를 위해 자신만의 무료 래퍼를 작성하는 것이 좋습니다.

그것은 (잠재적으로) 만듭니다 악마가 코에서 날아갑니다.

그렇게하지 마십시오. 해방 된 메모리가 전화 사이에 다른 것에 재 할당된다면 free, 그러면 상황이 엉망이 될 것입니다.

나쁜 것들 (TM)

정말로, 나는 그것이 정의되지 않았다고 생각합니다. 그래서 Norad의 메인 프레임과 함께 "Global Thermonuclear War"를 포함하는 등 무엇이든

프로그램이 충돌하거나 메모리가 부패하거나 다른 미묘한 부정적인 영향을 미칠 수 있습니다. 메모리를 삭제 한 후에는 NULL (0)으로 설정하는 것이 좋습니다. 널 포인터를 해방시키려는 것은 아무것도하지 않으며 안전하다고 보장됩니다. C ++에서 삭제에 대해서도 마찬가지입니다.

요컨대 : "정의되지 않은 행동".

(이제, 그것이 포함 할 수있는 것과 그것이 왜 다른 사람들이 이미 말한 경우입니다. 나는 그 용어가 상당히 일반적이기 때문에 여기서 용어를 언급 할 가치가 있었지만).

아래의 이상하다고 인정되는 매크로는 몇 가지 종류의 보안 취약점을 제거하고 디버깅을 지원하는 유용한 드롭인 대체품입니다. free()'d 영역에 대한 액세스는 자동으로 메모리를 손상시키는 대신 세그폴트가 발생할 가능성이 높기 때문입니다.

#define my_free(x) do { free(x); x = NULL; } while (0)

do-while 루프는 주변 코드가 다중 명령문을 더 쉽게 소화하도록 돕는 것입니다.예를 들어if (완료) my_free(x);

또 다른 흥미로운 상황 :

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;

if (myString)
{
    free(myString);
    myString = NULL;
}
// Now this one is safe, because we keep to the rule for 
// setting pointers to NULL after deletion ...
if (myString)
{
    free(myString);
    myString = NULL;
}

// But what about this one:
if (yourString)
{
    free(yourString);
    yourString = NULL;
}

//?!? :)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top