当通过调用malloc()动态分配一定数量的内存时,操作系统内部以某种方式存储分配的内存量(跟踪使用的内存等等),因此我们只在不再需要内存块时提供指向free()的指针。
但是,我们使用可移植和OS/编译器无关的方式检索这个大小的指针。在Windows/Visual上有一些不可移植的方法,如大号,在glibc中也有大小。因此,唯一的方法仍然是传播所有需要的大小和相应的指针等,这可能是非常容易出错。
因此,问题是:为什么C标准开发人员决定不将可移植功能包括在标准中?
问“为什么”可能是不恰当的,因为它通常涉及到一些基于意见的事情,至少在某种程度上是这样的,但我认为这样做有一些根本的理由。
发布于 2020-05-02 19:17:48
没有技术问题阻止C标准委员会添加一个新的库函数来检索通过malloc()、calloc()、realloc()、aligned_alloc()、strdup()或任何类似函数以前返回的有效指针可访问的字节数。返回的数字不一定是最初传递给分配函数的大小,可以想象这些信息可能根本不可用,因此0的返回值将指示信息不可用。
这种函数尚未添加的原因可能是C标准委员会通常非常不愿意添加新功能。例如,strdup()花了30多年的时间才最终进入C标准(它将是下一个版本的一部分),尽管大多数C库已经有了几十年的一致实现。
该函数对于以前没有由内存分配函数返回或已经释放的指针具有未定义的行为,就像free或realloc一样。是否为NULL定义它是值得商榷的,但在这种情况下,0的返回值似乎是合适的。如果不知道大小(这对于不存储此信息的虚拟分配器来说是可能的),则0的返回值也会指示此条件。
下面是GNU中提供的malloc_usable_size手册页的摘要:
名称
malloc_usable_size-获取从堆中分配的内存块的大小 简要说明 #包括 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)
发布于 2020-05-02 18:11:01
因为您可以获得指向没有从malloc和朋友那里返回的内容的指针。
int x = 10;
int * p = &x;您正在讨论的函数必须知道p是否从malloc返回(可能很昂贵)。如果不是(如本例中的情况),则无法知道分配的空间数量。如果您得到一个指向malloc分配的东西的指针,而不是malloc分配的确切指针,您也会遇到问题。
int * p = malloc(sizeof(int) * 10);
int * p2 = p + 5;如果我要求p2的大小,正确的结果是什么
一种更一致的方法是按照需要的地方传递大小。这允许您处理地址,而不管它们来自何处,包括对某个内存块的偏移(例如,数组,正如我在上面使用p2时所做的那样)。
https://stackoverflow.com/questions/61564043
复制相似问题