如何解决realloc 在 C++ 中如何处理额外空间?
假设我像这样分配了一个大小为 40 的块:
int *x=malloc(40);
现在当我像这样调用 realloc 时:
realloc(x,100);
其他 60 人会怎样?这是我的建议。
A) 将被设置为 0
B) 将包含来自 malloc 以新分配的 100 返回的垃圾
C) 前 40 个正常复制,其他 60 个也从 x 之后的内存块复制。 (出界)。
解决方法
realloc
是一个 C 函数,因此我们可以查看它的 man page 以获取有关 realloc
作用的更详细说明。摘录(强调我的):
realloc()
函数将 ptr 指向的内存块的大小更改为 size 字节。内容将在从区域开始到新旧大小的最小值的范围内保持不变。 如果新的大小大于旧的大小,添加的内存将不会被初始化。
所以 B 似乎是你的答案。
(但是请注意,realloc
不一定在每次调用中都在内部调用 malloc
。有时,您可能会注意到 realloc
之前和之后的指针地址没有改变。如果有在先前 malloc
的内存之后仍有空间,realloc
也可以保留额外的内存,而不是重新分配和复制所有内容)。
这是我的建议
你为什么要猜测一些你可以查到的东西?
例如,POSIX 文档是 here 并说最后 60 个字节将是不确定的。
如果您想知道该平台的行为方式(并且不关心可移植性),您可以查找任何平台的文档,或者您可以假设这些值未确定。
A) 将被设置为 0
可能在某些平台上,有时可能在其他平台上,但不能保证。
B) 将包含来自 malloc 以新分配的 100 返回的垃圾
不确定的值不一定是垃圾——它们可能都为零。或者新的内存可能被 0xdeadbeef
或其他一些魔法值填充。您只是不应该依赖任何特定的值 - 事实上,在您将一些已知值写入其中之前,您根本不应该读取该内存。
实际上,我什至不确定这句话的后半部分是什么意思。当然,前 40 个字节将是您写入原始分配的任何内容。
C) 前 40 个正常复制,其他 60 个也从 x 之后的内存块复制。 (出界)
这会使将 realloc
用于其既定目的是非法的,所以显然它不可能是真的。
前 40 个字节是从旧分配中复制的,您不应该依赖于接下来的 60 个字节具有任何特定值,直到您自己将一个字节放在那里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。