假设您通过malloc以下方式在堆上分配了一些内存:
someType x = malloc(someSize);
Run Code Online (Sandbox Code Playgroud)
当您不再需要时x,您free可以:
free(x)
Run Code Online (Sandbox Code Playgroud)
我想要执行此操作,编译器必须知道x指向的内存大小。我认为free执行类似:
x(假设为16)。如果以上内容是正确的,为什么标准中没有规定仅执行上述步骤直到第2步并将大小返回给程序员的函数,而实际上并未释放内存?
我在网上阅读的一些(不太令人信服的)原因:
malloc()实现通常跟踪一个区域的大小,但是它们可以间接执行此操作,或将其舍入到某个值,或者根本不保留它。是真的吗 可能malloc无法跟踪大小?free已经实施,则只需要其中一部分;实施应该是微不足道的。那么,为什么没有提供此功能的理由是坚定的,推动的,真实的呢?或者,更有可能的是,为什么上述原因实际上很重要,而我又缺少什么呢?
我认为这个问题已经被问到了(很可能是一个骗子),但是我只能找到类似的主题(顺便说一句,下面的问题是我在上面发现的一些异议的地方):
这里讨论了这样的功能是否存在,但是为什么不存在。
这里讨论(堆栈分配的)数组。
因为这完全没有必要。打电话的用户malloc()已经知道他/她要求的尺寸。如果他们想存储它,可以使用一个变量来完成。他们甚至可以将其存储在malloc的内存本身中!
其次,当您调用时malloc(size),您几乎永远不会获得精确size字节的内存块。标准唯一保证的是至少获得size字节。这种差异可能是由于诸如对齐,使用更大的块大小以防止碎片等之类的原因造成的。
现在,让我们假设标准库将提供您所要求的那种功能。它应该为您分配大小还是要求的大小?分配的大小在很大程度上取决于实现,并且实际上是没有意义的,因为仅允许您访问最初要求的字节数。如果超出此范围,则它是不确定的行为。如果您说请求的大小,则实现只需要分配的大小即可处理可用的大小,那么为什么还要浪费内存存储请求的大小呢?
由于没有人说服C标准委员会相信它的必要性,所以不存在这种功能。
提供它可能还需要与操作系统进行额外的接口连接-经常委派此类内存任务,因此可能需要进行更改才能实现新功能。由于许多平台都支持C,因此可能会损害C的声誉。
最后,您将用它做什么?我无法推测一个用例。如果你想跟踪分配的大小自己,然后为存根功能malloc,realloc,&C。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |