当某一数量的内存被动态分配时,通过调用 malloc()
,操作系统内部以某种方式存储了分配的内存量(用来跟踪已使用的内存等),所以我们只提供指向 free()
当我们不再需要该内存块时。
然而,我们 不能 以一种可移植的、与OScompiler无关的方式,只用指针检索该大小。有一些非可移植的方式,比如 _msize 在WindowsVisual C上,或 malloc_usable_size 在glibc中。所以,唯一的办法还是将所有需要的大小和各自的指针等一起传播,这可能非常容易出错。
所以,问题是:为什么C标准的开发者决定不在标准中加入一个可移植函数?
P.S.问 "为什么 "可能是不恰当的,因为它通常至少在某种程度上涉及到基于意见的东西,但在这里我相信有一些根本的原因。
没有任何技术问题可以阻止C标准委员会增加一个新的库函数来检索之前通过有效指针返回的可访问字节数。malloc()
, calloc()
, realloc()
, aligned_alloc()
, strdup()
或任何类似函数。返回的数字不一定是最初传递给分配函数的大小,而且可以想象,这些信息可能根本无法获得,所以返回值为 0
将表明该信息不可用。
之所以还没有增加这样的功能,可能是因为C标准委员会通常很不愿意增加新的功能。例如,花了30多年的时间 strdup()
最终被纳入C标准(它将成为下一个版本的一部分),尽管几十年来大多数C库中都有一致的实现。
这个函数对于任何没有被内存分配函数返回或已经释放的指针都会有未定义的行为,就像 free
或 realloc
. 是否定义为 NULL
是值得商榷的,但返回值为 0
在这种情况下似乎是合适的。如果不知道大小,对于不存储此信息的虚拟分配器来说是可能的,那么返回值为 0
也会表明这种情况。
这里是一个来自于 malloc_usable_size
存在于 GNU lib C 中。
NAME
malloc_usable_size
- 获取堆中的内存容量SYNOPSIS
#include <malloc.h> size_t malloc_usable_size(void *ptr);
描述
该
malloc_usable_size()
函数返回指向的块中可用的字节数。ptr
的一个指针,指向一个由malloc(3)
或相关功能。返回值
malloc_usable_size()
返回指向的分配的内存块中可用的字节数。ptr
. 如果ptr
是NULL
,0
被返回。属性
多线程(见
pthreads(7)
):malloc_usable_size()
函数是线程安全的。符合
本函数是GNU的扩展。
注释
返回的值是
malloc_usable_size()
可能会因为对齐和最小大小的限制而大于所要求的分配大小。 虽然多余的字节可以被应用程序覆盖而不会产生不良影响,但这并不是好的编程实践:分配中多余的字节数取决于底层实现。这个函数的主要用途是用于调试和反省。
另见
malloc(3)
因为你可以得到指向那些没有从 malloc
和朋友。
int x = 10;
int * p = &x;
你所说的函数将不得不计算出是否有 p
从 malloc
(可能很贵)。 如果没有(就像本例一样),它就无法知道分配的空间量。 如果你得到了一个指针,指向某个由 malloc
的指针,但不是由 malloc
.
int * p = malloc(sizeof(int) * 10);
int * p2 = p + 5;
如果我要求的大小是 p2
?
一个更一致的方法是在需要的地方传递大小。 这让你可以处理地址,不管它们来自哪里,包括一些内存块的偏移(例如,数组,就像我在用 p2
以上)。)