在阅读realloc()
时,我偶然发现了一些我需要澄清而不是忽视的疑问。你的答案非常受欢迎。为了清楚起见,我把它们放在了编号列表中。请不要介意这个问题的长度。
1)使用realloc()
时,如果内存块及其内容被移动到新位置,则原始地址是否会取消分配,就好像我们一样在它上面调用了free()吗?我已经从cplusplusreference
中读到了关于realloc
的以下内容,但是虽然它们接近于暗示原始内存块确实在这种情况下被解除分配,但我需要你的确认。
->C90 (C++98)C99/C11 (C++11)
Otherwise, if size is zero, the memory previously allocated at ptr is deallocated as if a call to free was made, and a null pointer is returned.
->If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still
valid, and with its contents unchanged).
2)以下是提出问题的另一条话:"If the new size is larger, the value of the newly allocated portion is indeterminate."
。嗯,这就是我想知道的事情
i)是否允许写入新分配的部分?
ii)新分配的部分是否使用垃圾值填充?
3)最后,如果将数组对象传递给realloc(
,该怎么办?)我问,因为虽然类型仍然是char*
,在源网站中提到,参数应该是"Pointer to a memory block previously allocated with malloc, calloc or realloc.
这里也是 UB ,因为我在free()
的描述中读到{{1} }} free()
答案 0 :(得分:9)
1)在使用
realloc()
时,如果内存块及其内容被移动到新位置,那么原始地址是否会被解除分配,就像我们在其上调用free()
一样?
是的,如果realloc()
返回指向其他位置的指针,则旧位置为free
d。
如果free
无法获得足够大的内存块并返回realloc
,则不是NULL
。
2)这是提出问题的另一条线:"如果新尺寸较大,则新分配的部分的值是不确定的。"。好,这就是我想要的知道
i)是否允许写入新分配的部分?
是的,当然。这就是重新分配更大内存块的全部意义。
ii)新分配的部分是否使用垃圾值填充?
充满垃圾,根本没有填充 - 内存块的内容是不确定的,除了从旧块复制的部分。您不应该关心有什么位,在阅读之前将自己的东西放在那里。
3)最后,如果将数组对象传递给
realloc()
怎么办?我问,因为虽然type仍然是char*
,但是在源站点中提到,参数应该是"指向先前用malloc
分配的内存块的指针,{{1} }或calloc
。这也是UB,因为我在realloc
的描述中读到free()
是的,如果您将参数(free()
除外)传递给NULL
,而该参数不是之前拨打realloc
,malloc
或calloc
的。 (从那以后没有realloc
),行为未定义。
可以合法传递给free
的指针与传递给realloc
的指针完全相同。