C++ 在c中使用realloc

C++ 在c中使用realloc,c++,c,C++,C,我使用的是void*realloc(void*pointer,size\u t size)增加指针的大小。realloc是如何工作的? 它是否创建一个nre地址空间,并将旧值复制到新地址空间,并返回一个指向该地址的指针?或者它只是分配更多内存并将其绑定到旧内存 这要看情况了!如果无法适当调整内存区域的大小,则会分配一个新的内存区域,复制旧数据并释放旧内存。我认为答案是函数取决于请求的大小和可用堆 从程序员的角度来看,我认为我们得到的保证是,如果新的分配成功,指针是非空的。因此,指针可能会保持不变

我使用的是
void*realloc(void*pointer,size\u t size)
增加指针的大小。realloc是如何工作的?

它是否创建一个nre地址空间,并将旧值复制到新地址空间,并返回一个指向该地址的指针?或者它只是分配更多内存并将其绑定到旧内存

这要看情况了!如果无法适当调整内存区域的大小,则会分配一个新的内存区域,复制旧数据并释放旧内存。

我认为答案是函数取决于请求的大小和可用堆


从程序员的角度来看,我认为我们得到的保证是,如果新的分配成功,
指针
是非空的。因此,指针可能会保持不变,即使它现在指向由
size\u t

表示的较大内存块。Realloc不会更改指针的大小,指针的大小在同一体系结构上始终相同。它更改指针指向的已分配内存的大小。其工作方式如下所述:。简言之,是的,它分配了更多的内存,使您的内容保持不变;如果必须移动内存,它会复制内容。当然,您可以指定一个较短的大小,在这种情况下,它会修剪分配的内存,再次保持内容不变。

您误用了术语“地址空间”。进程的所有内存都存在于单个地址空间中。程序未使用的内存、其全局变量和堆栈称为“堆”
malloc
realloc
(和
calloc
,它只是
malloc
和clear)从堆中分配内存。大多数
realloc
的实现都会检查从
指针开始的(
size
字节)空闲空间是否足够(必须指向先前由
malloc
realloc
分配的块--
realloc
知道该块有多大),如果是这样,只需增加分配在
指针指定位置的块的大小,并返回,而不进行复制。如果没有足够的空间,它将执行相当于
newptr=malloc(大小);memcpy(新PTR、指针、旧块的大小);自由(指针);返回newptr。。。也就是说,它将分配一个足够大的块来容纳
大小
字节,将
指针处的数据复制到该块,释放旧块,并返回新块的地址。

有一个正确的答案:它会做第二个(如果它可以做得到的话)或第一个(但只有在它必须做的时候)

然而,有时两者都做不到,而且会失败。小心:如果无法调整数据大小,它将返回
NULL
,但内存将可用。这样的代码是错误的:

ptr = realloc(ptr, size);
如果
realloc
返回
NULL
,则旧的
ptr
将永远不会获得
免费的
d,因为您已经用
NULL
覆盖了它。要正确执行此操作,您必须执行以下操作:

void *tmp = realloc(ptr, size);
if(tmp) ptr = tmp;
else /* handle error, often with: */ free(ptr);
在BSD系统上,上述函数被转换为名为
reallocf
的库函数,可按如下方式实现:

void *reallocf(void *p, size_t s)
{
    void *tmp = realloc(p, s);
    if(tmp) return tmp;
    free(p);
    return NULL;
}
允许您安全使用:

ptr = reallocf(ptr, size);

请注意,如果
realloc
必须分配新空间并复制旧数据,它将
释放
旧数据。只有在无法调整大小的情况下,如果调整大小失败是一个可恢复的错误,它才会保持数据的完整性。

您可以在手册页中轻松找到答案。
ptr=realloc(ptr,size)的可能重复项if(!ptr)fatal_error(),则代码>没有错误。。。而且很少做其他事情。当然,如果您确实试图通过释放现有数据(例如弱指针)来从OOM恢复,那么
ptr=
的使用是非常糟糕的。寓意是,您永远不应该调用plain
malloc
realloc
,只有那些可能试图恢复内存并死亡的包装版本,或者在无法分配内存时抛出异常(C中的longjmp)。当然,如果C++编程,一个人应该使用<代码>新< /C> >,或者更好地,STL。@吉姆——不一定。如果您有一个数组或字符串库(纯C)需要调整内部大小,那么如果不能适当调整缓冲区大小,则该库不应死亡,但也不应丢弃所有现有数据。我认为建议的
reallocf
实现有问题。尤其是,
p
可以是
NULL
。如果
tmp==NULL
,您将
free
一个
NULL
指针。@RaffiKhatchadourian
free(NULL)
什么都不做,这样做完全安全。