Malloc、Ralloc、免费

Malloc, Realloc, Free

int *p=malloc(20);

现在Heap会分配20字节的内存。 returns 指向指针 p 的第一个字节的地址。(假设没有返回 NULL 指针)。

现在我这样做了,

int *q=realloc(p, 40);

现在他们有以下可能性:

1]。 q=p

2]。 q!=p

3]。 q=NULL

忘记了可能性 2 和 3。

现在我写:

free(p);

现在会发生什么?

前 20 个字节将变为空闲,其余字节仍将保持分配状态,还是所有 40 个字节将变为空闲或其他?

调用 free 会导致未定义的行为。推理如下:

函数 realloc 将释放 1 指针 p 指向的 space 指针。

p 指向的对象的生命周期2 在释放时结束。

函数 free 接收到一个指向释放的指针 space 并导致未定义的行为3.

此外,realloc 调用后指针 p 的值是不确定的,使用它可能会由于陷阱表示而导致未定义的行为。

换句话说,即使realloc返回的指针和指针p指向同一个space的开始,realloc分配的对象也算作一个新对象,有新的生命周期,不一定使用指针 p.

释放

1(引自:ISO/IEC 9899:201x 7.22.3.5 realloc函数2)
realloc 函数释放 ptr 和 returns a 指向的旧对象 指向大小由 size 指定的新对象的指针。

2(引自:ISO/IEC 9899:201x 7.22.3内存管理函数1)
已分配对象的生命周期从分配开始延长 直到重新分配

3(引自:ISO/IEC 9899:201x 7.22.3.3 自由函数2)
否则,如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果 space 已通过调用 free 或 realloc 解除分配,则 行为未定义。

4(引自:ISO/IEC 9899:201x 6.2.4 对象的存储时长2)
指针的值在以下情况下变得不确定 它指向(或刚刚过去)的对象达到其生命周期的终点。

来自 malloc / realloc 手册页

The realloc() function tries to change the size of the allocation pointed to by ptr to size, and returns ptr. If there is not enough room to enlarge the memory allocation pointed to by ptr, realloc() creates a new allocation, copies as much of the old data pointed to by ptr as will fit to the new allocation, frees the old allocation, and returns a pointer to the allocated memory.

您应该了解一下 malloc()free()realloc() 的工作原理。 最简单的方法是使用简单的实现。

http://arjunsreedharan.org/post/148675821737/write-a-simple-memory-allocator

realloc(p,new_size) 调整 p 指向的内存块的大小,该内存块之前是通过调用 malloc 或 calloc 分配的。 现在,如果与先前分配的内存相邻的内存可用,它 returns 与我们传递给它的指针相同 p 所以在这种情况下,如果你将释放(q) p 和 q 指向的 space 将被删除。

但是如果与先前分配的内存相邻的内存不可用,那么它returns新分配的不同指针space所以在这种情况下,如果你将释放(q)新分配的space 将被删除

在这两种情况下,删除的内存都是 40 位