关于 extra Space,realloc 在 C++ 中的表现如何?

How does realloc behave in C++ regarding extra Space?

假设我分配了一个大小为 40 的块,如下所示:

int *x=malloc(40);

现在当我这样调用 realloc 时:

realloc(x,100);

另外 60 个人会怎样?这是我的建议。

A) 将被设置为 0

B) Will Contain garbage from what malloc returned with a new allocation of 100

C) 前40个是正常复制的,另外60个也是从x之后的内存块复制的。 (越界)。

realloc 是一个 C 函数,所以我们可以查看它的 man page 来更详细地解释 realloc 的作用。摘录(强调我的):

The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size is larger than the old size, the added memory will not be initialized.

所以 B 似乎是你的答案。

(注意,realloc不一定在每次调用时都在内部调用malloc。有时,你可能会注意到指针地址在realloc前后没有变化。如果在先前 malloc 的内存之后仍然有 space,realloc 也可以只保留额外的内存,而不是重新分配和复制所有内容。

Here are my suggestions

你为什么要猜测你可以查找的东西?

例如,POSIX 文档是 here 并且说最后六十个字节是不确定的。

如果您想知道该平台的行为方式(并且不关心可移植性),您可以查找任何平台的文档,或者您可以假设这些值未确定。

A) Will be set to 0

也许在某些平台上,有时在其他平台上,但不能保证。

B) Will Contain garbage from what malloc returned with a new allocation of 100

不确定的值不一定是垃圾 - 它们可能都是零。或者新的内存可能充满了 0xdeadbeef 或其他一些魔法值。您只是不应该依赖于任何特定值 - 事实上,在您将一些已知值写入其中之前,您根本不应该读取此内存。

其实我连这句话后半句的意思都搞不清楚。当然, 四十个字节将是您写入原始分配的任何内容。

C) The first 40 are copied normally and the other 60 are copied too from the memory block after x. (goes out of bound)

这会使 realloc 将其用于其声明的目的是非法的,所以显然这不可能是真的。

前四十个字节是从旧分配中复制的,您不应该依赖接下来的六十个字节具有任何特定值,直到您自己将一个放在那里。