【问题标题】:Why does realloc need two pointers? Handling a return of NULL?为什么 realloc 需要两个指针?处理 NULL 的返回?
【发布时间】:2013-12-27 05:08:45
【问题描述】:

我想我知道,但我不想继续我的工作不正确。

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

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;

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

【问题讨论】:

  • 如果realloc() 返回NULL,那么你有严重的问题。不,这不仅是需要两个指针的原因。如果要扩展指针指向的内存块,它可能不再适合原来的位置,所以realloc() 需要移动它,更改指针(并使其无效)。跨度>
  • sleep 是否应该让操作系统有机会移动内存?无论如何,我认为我不会依赖无限循环,因为它可能会永远循环。
  • 考虑操作失败或找到一些不必要的缓存/数据来刷新。睡眠不会帮助(单线程)应用程序耗尽地址空间,而不是整个系统耗尽虚拟内存。
  • @Jongware - 我将在内存在 64 GB 到 128 GB 之间的任何系统上工作。我将要处理的程序将有 8 个线程,每个线程都分配内存块。 sleep() 的目标是当我设法分配所有可用内存和一个线程 free() 为另一个线程分配一些内存时分配/calloc/realloc。
  • @JoeManiaci:这听起来像是死锁的秘诀,每个进程都需要等待其他进程,每个进程都需要更多内存来完成大型操作。尽管如此,典型的 64 位系统很少会以这种方式耗尽内存。在实践中,虚拟内存和磁盘交换通常会确保性能在 malloc 失败之前下降到无法承受的水平。

标签: c memory dynamic realloc


【解决方案1】:

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

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

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

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

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

当内存分配失败时,您要么需要复杂的恢复策略,要么需要干净的退出策略。尝试巧妙分配分配的可能性很高,这会使您的程序极难遵循。

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


现在,我刚刚写了所有这些,然后在 cmets 中看到了您对您实际上在做什么的澄清。如果你很高兴 sleep-loop 解决了你的问题,那就去做吧,但是在里面放一些代码来检测奇怪的等待并报告它们,这样你在调试时就不会发疯。

更丰富的解决方案是将这些东西包装在您自己的内存管理器中,并使用信号量驱动的队列或其他为您的程序量身定制的机制。使用 sleeps 有点幼稚。

另外,我不建议分配小块数据。如果你经常这样做,你可能会分散你的记忆。如果您需要,那么您可能需要在每个线程中进行内存池并让它们请求更大的块。

【讨论】:

  • 所有这些数据都来自 TCP 连接。因此,由于 realloc 的持续 NULL 返回,我更希望获得超时。这是我想要处理的超时,因为我真的别无选择,只能尝试接收所有这些数据。
猜你喜欢
  • 2011-08-24
  • 2021-04-25
  • 1970-01-01
  • 2011-05-24
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2022-01-02
相关资源
最近更新 更多