为什么realloc需要两个指针?处理NULL的返回?

为什么realloc需要两个指针?处理NULL的返回?,c,memory,dynamic,realloc,C,Memory,Dynamic,Realloc,我想我知道,但我不想继续我的工作是错误的 你看到的大多数例子是 char* temp; char* temp1; temp = malloc(10, sizeof(char); temp1 = realloc(temp, 11*sizeof(char)); 现在我假设你不使用 temp = realloc(temp, 11*sizeof(char)); 因为如果没有足够的内存,就会返回一个空的ptr,因此无法访问原始内存块 那么,下面的方法是处理返回的空指针的好方法吗 while((tem

我想我知道,但我不想继续我的工作是错误的

你看到的大多数例子是

char* temp;
char* temp1;

temp = malloc(10, sizeof(char);
temp1 = realloc(temp, 11*sizeof(char));
现在我假设你不使用

temp = realloc(temp, 11*sizeof(char));
因为如果没有足够的内存,就会返回一个空的ptr,因此无法访问原始内存块

那么,下面的方法是处理返回的空指针的好方法吗

while((temp1 = realloc(temp, 11*sizeof(char))) == NULL)
    sleep(3);

temp = temp1;
temp1 = NULL;
我知道有些人说,当你在代码中加入睡眠时,可能有更好的方法。但在我看来,我别无选择,只能等待

现在我假设您不使用
temp=realloc(temp,
11*sizeof(char))因为如果没有足够的内存,您将得到一个
返回NULL ptr,因此无法访问原始内存
街区

对。如果
temp
是对内存块的唯一引用,这将导致内存泄漏

那么,下面的方法是处理返回的空指针的好方法吗

while((temp1 = realloc(temp, 11*sizeof(char))) == NULL)
    sleep(3);

temp = temp1;
temp1 = NULL;
不,那个循环可能会永远循环。在这种情况下,您不太可能仅仅尝试扩展到11个字节。正如H2CO3在评论中所说的那样,如果失败,您将面临严重问题

如果您的系统内存不足,它可能会变得不稳定。如果只有进程内存碎片化或地址空间不足,那么再多的等待也无济于事,除非程序的其他部分正忙于解决问题

当内存分配失败时,您要么需要一个复杂的恢复策略,要么需要一个干净的退出策略。很有可能在分配问题上耍聪明会使你的计划极难遵循

除非你写的东西将是太空探测器或其他任务关键型设备的一部分(无论如何都不太可能依赖动态内存),否则你最好的策略是发出一条有用的错误消息并干净地退出


现在,我写了所有这些,然后在评论中看到了你对你实际所做的事情的澄清。如果您对睡眠循环解决了您的问题感到高兴,那么就去做吧,但是在那里放一些代码来检测奇怪的等待并报告它们,这样您就不会在调试时发疯

一个更丰富的解决方案是将这些内容封装在您自己的内存管理器中,并使用信号量驱动的队列或其他一些适合您的程序的机制。使用睡眠有点天真


此外,我不建议分配小块数据。如果你经常这样做,你的记忆可能会碎片化。如果需要,则可能需要在每个线程中执行内存池,并让它们请求更大的块。

如果
realloc()
返回
NULL
,则您会遇到严重问题。不,这不仅仅是需要两个指针的原因。如果要扩展指针指向的内存块,它可能不再适合原来的位置,因此
realloc()
将需要移动它,更改指针(并使其无效)。
sleep
是否应该给操作系统一个移动内存的机会?无论如何,我不认为我会依赖一个无限循环,因为它可能永远循环。考虑失败的操作或寻找一些不必要的缓存/数据来代替。睡眠对地址空间不足的(单线程)应用程序没有任何帮助,而整个系统的虚拟内存不足。@Jongware-我将在内存介于64 GB和128 GB之间的系统上工作。我将要处理的程序将有8个线程,每个线程分配内存块。sleep()的目标是当我设法将所有可用内存分配给另一个线程时,其中一个线程释放()将另一个线程的一些内存分配给alloc/calloc/realloc。@JoeManiaci:这听起来像是一个死锁的秘方,每个进程都需要等待其他进程,每个进程都需要更多内存来完成一个大型操作。然而,典型的64位系统很少以这种方式耗尽内存。实际上,虚拟内存和磁盘交换通常会确保在malloc出现故障之前,性能已降至无法承受的水平。所有这些数据都来自TCP连接。所以我更希望得到一个超时,因为realloc的持续空返回。这是我想要处理的超时,因为我真的没有选择,只能尝试接收所有这些数据。