"malloc(0)"이 null이 아닌 포인터를 반환하면 "free"로 전달할 수 있습니까?
나는 그들이 어떻게 그들을 죽었는지에 대한 논의하는지에 대해 읽어왔습니다.malloc크기가 0인 블록을 요청할 때 동작합니다.
나는 그 행동을 이해합니다.malloc(0)는 구현 정의되어 있으며, Null 포인터 또는 Null이 아닌 포인터를 반환해야 하지만 액세스할 수 없습니다.(사용 가능한 메모리를 가리킨다는 보장이 없기 때문에 말이 됩니다.)
그러나 액세스할 수 없는 null이 아닌 포인터가 있으면 에 전달할 수 있습니다.free보통의 방법으로?아니면 불법인가요? 제가 받은 포인터가malloc(0)실제 할당된 메모리 블록을 가리키지 않을 수 있습니까?
구체적으로, 다음 코드는 잘 정의된 동작을 가지고 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int* x = (int*) malloc(0);
if (x == NULL) {
printf("Got NULL\n");
return 0;
} else {
printf("Got nonnull %p\n", x);
}
free(x); // is calling `free` here okay?
}
C99 표준(실제로는 WG14/N1124).위원회 초안 -- 2005년 5월 6일. ISO/IEC 9899:TC2)는 다음에 대해 말합니다.malloc():
포인터가 할당된 공간의 시작(가장 낮은 바이트 주소)으로 포인트를 반환했습니다.공간을 할당할 수 없는 경우 null 포인터가 반환됩니다.요청된 공간의 크기가 0이면 동작이 정의됩니다. null 포인터가 반환되거나 동작은 반환된 포인터가 개체에 액세스하는 데 사용되지 않아야 한다는 점을 제외하고는 크기가 0이 아닌 값인 것 같습니다.
에 대하여free():
그렇지 않으면 인수가 calloc, malloc 또는 realloc 함수에 의해 이전에 반환된 포인터와 일치하지 않거나 공간이 free 또는 realloc 호출에 의해 할당 취소된 경우 동작이 정의되지 않습니다.
IEEE 규격 1003.1-2008(POSIX), 2016년판은 다음과 같이 설명합니다.free():
free() 함수는 ptr이 가리키는 공간이 할당 해제되도록 합니다. 즉, 추가 할당을 위해 사용할 수 있도록 합니다.ptr이 null 포인터일 경우 어떠한 조치도 발생하지 않습니다.그렇지 않으면 인수가 malloc()처럼 메모리를 할당하는 POSIX.1-2008의 함수에 의해 이전에 반환된 포인터와 일치하지 않거나 free() 또는 realloc() 호출에 의해 공간이 할당 취소된 경우 동작이 정의되지 않습니다.
그래서, 뭐든*alloc()반송, 전달할 수 있습니다.free().
의 현재 구현에 대해서는malloc():
FreeBSD는 기여된 Jemalloc을 사용합니다.
void *
je_malloc(size_t size)
{
void *ret;
size_t usize JEMALLOC_CC_SILENCE_INIT(0);
if (size == 0)
size = 1;
[...]
반면에 애플의 Libmalloc은 그렇습니다.
void *
szone_memalign(szone_t *szone, size_t alignment, size_t size)
{
if (size == 0) {
size = 1; // Ensures we'll return an aligned free()-able pointer
[...]
또한 GLIBC는 요청된 크기를 변경합니다. GLIBC는 요청된 크기(바이트)를 매개 변수로 하여 이 매크로에 대한 호출을 사용하여 크기를 특정 경계 또는 단순히 최소 할당 크기에 맞춥니다.
#define request2size(req) \
(((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
MINSIZE : \
((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
예, 실제로 메모리 누수를 방지하려면 그렇게 해야 합니다.
malloc 시스템은 일반적으로 포인터 바로 앞 공간에 숨겨진 제어 블록을 할당 크기와 같은 정보와 함께 반환합니다.할당 크기가 0이면 이 블록은 여전히 존재하며 malloc가 null이 아닌 값을 반환하는 경우 메모리를 차지합니다.
언급URL : https://stackoverflow.com/questions/44331280/if-malloc0-returns-a-non-null-pointer-can-i-pass-that-to-free
'programing' 카테고리의 다른 글
| .NET에서 SSIS 패키지를 실행하는 방법은 무엇입니까? (0) | 2023.06.11 |
|---|---|
| 루비의 "and"와 &&의 차이점은 무엇입니까? (0) | 2023.06.11 |
| MessageBox의 GTK 구현 (0) | 2023.06.11 |
| 비트 필드가 있는 구조물의 크기는 어떻게 결정/측정됩니까? (0) | 2023.06.11 |
| 개체를 배열로 변환하는 유형 스크립트 - *ngFor는 개체 반복을 지원하지 않기 때문입니다. (0) | 2023.06.11 |