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



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

你看到的大多数例子是。。。

char* temp;
char* temp1;
temp = malloc(10, sizeof(char);
temp1 = realloc(temp, 11*sizeof(char));

现在我假设你不用。。。

temp = realloc(temp, 11*sizeof(char));

因为如果内存不足,就会返回一个NULL ptr,从而无法访问原始内存块。

那么,以下是处理返回的NULL指针的好方法吗?

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

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

现在我假设您不使用temp = realloc(temp, 11*sizeof(char));,因为如果内存不足返回NULL ptr,因此无法访问原始内存块

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

那么,以下是处理返回的NULL指针的好方法吗?

没有。这个循环可能永远循环。在这种情况下,您不太可能简单地尝试扩展到11个字节。正如H2CO3在评论中所说,如果失败,你就会遇到严重的问题。

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

当内存分配失败时,您需要一个复杂的恢复策略,或者一个干净的退出策略。很有可能试图巧妙地分配会让你的程序变得极其难以执行。

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


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

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

此外,我不建议分配小块数据。如果你做了很多这样的事情,你可能会把你的记忆碎片化。如果您需要,那么您可能需要在每个线程中进行内存池,并让它们请求更大的块。

相关内容

最新更新