“必须一次性释放使用 calloc 分配的内存”?

"Memory allocated with calloc must be freed all at once"?

提问人:Plouff 提问时间:3/19/2023 更新时间:3/19/2023 访问量:87

问:

我读到分配了“必须一次释放所有”的内存。calloc

这是否意味着情况并非如此?malloc

如果是,有人可以给我一个真实世界的例子吗? 非常感谢!

c malloc 动态内存分配 自由 calloc

评论

0赞 tkausl 3/19/2023
我想你可以,不确定是否有任何实现确实释放了该内存中未使用的部分。realloc
0赞 Clifford 3/19/2023
如果你在某处“读到”了一些东西,你应该提供引文或完全的上下文。就其本身而言,很难猜测作者的意图,作者甚至可能不正确,或者可能没有将英语作为森林语言。最好阅读和理解函数本身的文档;它会告诉你任何人都可以知道的关于函数本身的一切。
0赞 Plouff 3/20/2023
@Clifford:对不起,我丢失了来源:/...

答:

4赞 chqrlie 3/19/2023 #1

使用 和 分配的内存以相同的方式释放:通过将分配器返回的指针传递给 。callocmallocfree

混淆可能来自这样一个事实,即使用 2 个参数调用来分配数组,一个参数用于元素大小,另一个参数用于元素数量。All at sudden 可能指的是这样一个事实,即元素不能单独释放,必须使用指向初始元素的指针来调用,初始元素是 返回的指针。callocfreecalloc

调用 在语义上等同于: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 所说,我的困惑来自于引用的作者(我丢失了)试图避免混淆......但是让我感到困惑!