programing

"malloc(0)"이 null이 아닌 포인터를 반환하면 "free"로 전달할 수 있습니까?

iphone6s 2023. 6. 11. 10:25
반응형

"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

반응형