c에서 이미 해제된 메모리를 해제하려고 하면 어떻게 됩니까?
예를 들어,
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
이렇게 하면 부작용이 있습니까?
여기 장과 절이 있습니다.
만약 논쟁이 [에게]
freefunction]이(가) 이전에 반환된 포인터와 일치하지 않습니다.calloc,malloc, 아니면realloc기능 또는 공간이 다음으로 호출에 의해 할당 해제된 경우free아니면realloc, 동작은 정의되지 않았습니다. (ISO 9899:1999 - 프로그래밍 언어 — C, 섹션 7.20.3.2)
무, 무음 메모리 손상 또는 분할 오류 중 하나입니다.
네, 프로그램이 다운되는 이중 무료 오류가 발생할 수 있습니다.할당된 메모리를 추적하기 위한 malloc의 내부 데이터 구조와 관련이 있습니다.
답변 요약:
네, 나쁜 일들이 일어날 수도 있고 일어날 수도 있습니다.
이를 방지하려면 다음을 수행합니다.
free(myString);
myString = NULL;
메모리에 대한 모든 참조를 다음과 같이 설정해야 합니다.NULL다른 것들이 만들어지면요.
또한, 전화하기free()와 함께NULL아무 조치도 취하지 않습니다.자세한 내용은 man free를 참조하십시오.
영리하지 못합니다.이중 사용 가능한 취약성에 대한 Google.포인터를 다음으로 설정합니다.NULL그런 벌레들을 피하기 위해 자유롭게 한 후에.
그것은 (잠재적으로) 악마가 코 밖으로 날아오르게 만듭니다.
어떤 시스템에서 실행하느냐에 따라 아무 일도 일어나지 않으며 프로그램이 충돌하거나 메모리가 손상되거나 기타 여러 가지 흥미로운 효과가 발생합니다.
Bad Things (TM
정말로, 나는 그것이 정의되지 않았다고 생각합니다. 그래서 NORAD의 메인프레임으로 "지구 열핵 전쟁"을 하는 것을 포함해서.
포인터를 해제한 후에는 항상 NULL로 설정합니다.Null 포인터를 해제하는 것이 안전합니다.
이렇게 자동으로 할 수 있는 무료 포장지를 직접 작성하는 것은 가치가 있습니다.
그러지마세요.해제된 메모리를 다음으로 호출하는 사이에 다른 메모리로 재할당하는 경우free, 그러면 일이 엉망이 될 겁니다.
프로그램이 손상되거나 메모리가 손상되거나 다른 미묘한 부정적인 영향을 미칠 수 있습니다.메모리를 삭제한 후 NULL (0)로 설정하는 것이 좋습니다.null 포인터를 해제하려고 하면 아무 것도 할 수 없으며 안전할 수 있습니다.c++에서 삭제하는 경우에도 마찬가지입니다.
간단히 말해서 "정의되지 않은 행동"입니다.
(자, 그것이 무엇을 포함할 수 있고 왜 그것이 다른 사람들이 이미 말한 경우입니다.나는 단지 이 용어가 꽤 흔하기 때문에 여기서 언급할 가치가 있다고 생각했습니다).
아래의 이상한 매크로는 메모리를 자동으로 손상시키는 대신 free()'d 영역에 대한 액세스가 segfault일 가능성이 높기 때문에 몇 가지 보안 취약성을 제거하고 디버깅을 지원하는 유용한 드롭인 대체입니다.
#define my_free(x) do { free(x); x = NULL; } while (0)
할 동안 루프는 다중문을 주변 코드가 더 쉽게 소화할 수 있도록 도와주는 것입니다. 예를 들어, (완료된) 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;
}
//?!? :)
언급URL : https://stackoverflow.com/questions/135474/what-happens-when-you-try-to-free-already-freed-memory-in-c
'programing' 카테고리의 다른 글
| HTML 테이블의 내용 중심을 맞추는 방법은? (0) | 2023.10.29 |
|---|---|
| cursor. execute는 django에서 아무것도 반환하지 않지만 mysql에서 작동합니다. (0) | 2023.10.29 |
| 이 jQuery ready 기능들의 차이점은 무엇입니까? (0) | 2023.10.29 |
| strtok()이 안전하지 않은 것으로 간주되는 이유는 무엇입니까? (0) | 2023.10.29 |
| 모든 열에 대한 Oracle 열 너비 (0) | 2023.10.29 |