提问人:Plouff 提问时间:3/19/2023 更新时间:3/19/2023 访问量:87
“必须一次性释放使用 calloc 分配的内存”?
"Memory allocated with calloc must be freed all at once"?
问:
我读到分配了“必须一次释放所有”的内存。calloc
这是否意味着情况并非如此?malloc
如果是,有人可以给我一个真实世界的例子吗? 非常感谢!
答:
4赞
chqrlie
3/19/2023
#1
使用 和 分配的内存以相同的方式释放:通过将分配器返回的指针传递给 。calloc
malloc
free
混淆可能来自这样一个事实,即使用 2 个参数调用来分配数组,一个参数用于元素大小,另一个参数用于元素数量。All at sudden 可能指的是这样一个事实,即元素不能单独释放,必须使用指向初始元素的指针来调用,初始元素是 返回的指针。calloc
free
calloc
调用 在语义上等同于:calloc(n1, n2)
#include <limits.h>
#include <stdlib.h>
#include <string.h>
void *calloc(size_t n1, size_t n2) {
if (n1 != 0 && n2 > SIZE_MAX / n1)
return NULL;
size_t size = n1 * n2;
void *p - malloc(size);
if (p != NULL)
memset(p, 0, size);
return p;
}
评论
0赞
Plouff
3/20/2023
你肯定明白了。这句话可能是放在源代码中(我丢失了......)让人们远离单独释放分配元素的想法......但这完全让我感到困惑!感谢您提供等效代码!
1赞
Harith
3/19/2023
#2
除了将分配的内存初始化为所有位 0(而没有)之外,在语义上没有什么不同。calloc()
malloc()
calloc() 函数应为 nelem 元素,每个元素的大小(以字节为单位)均为 elsize。空间 应初始化为所有位 0。
传递到的指针必须指向与调用内存分配函数返回的内存块相同的内存块,否则行为是未定义的。free()
free() 函数应使 ptr 指向的空间为 解除分配;也就是说,可用于进一步分配。如果 ptr 为 null 指针,则不会发生任何操作。否则,如果 参数与函数之前返回的指针不匹配 在 POSIX.1‐2008 中,它分配内存的方式好像通过 malloc() 或如果 空间已通过调用 free() 或 realloc() 解除分配, 行为未定义。
如果目的是使用未使用的空间(缩小分配的内存块),请考虑使用 调整其大小。free()
realloc()
评论
1赞
Plouff
3/20/2023
谢谢你的回答。它证实了我对这些函数用法的理解。实际上,正如 chqrlie 所说,我的困惑来自于引用的作者(我丢失了)试图避免混淆......但是让我感到困惑!
评论
realloc