【发布时间】: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 失败之前下降到无法承受的水平。