首页 > 解决方案 > 我可以确定重新分配更少的内存总能找到足够的内存吗?

问题描述

假设我刚刚malloc编辑x了字节的内存,在对它们做了一些事情之后我想要realloc y < x字节。我可以做到这一点,但确保我realloc会找到足够的内存吗?例子,

int *p = malloc(10);
if (p != NULL) {
    // Do something with `p`.
    int *p_ = realloc(p, 5);
    // Keep doing something else.
}

即使我重新分配的内存比原来的少,我是否应该确保p_不是?NULL我认为当请求的内存超过可用内存时*alloc函数会返回NULL,以前的代码可以安全使用吗?

标签: cmemorymallocallocation

解决方案


我可以确定重新分配更少的内存总能找到足够的内存吗?
我可以做到这一点,但确保我的 realloc 会找到足够的内存吗?

不,realloc(p, 5);可能会失败并返回NULL


即使我重新分配的内存比原来的少,我是否应该确保 p_ 不是 NULL ?

是的,当缩小尺寸并返回 is时,代码NULL可以继续使用旧值指针 - 它仍然有效。

int *p_ = realloc(p, 5); 
if (p_) {
  p = p_;
} else /* if new_size <= old_size and new_size > 0 */ {
  ; // Simply continue with the old `p`, it is still good.
}
// Do something with `p`.
…
free(p);

注意:else一般来说,这条路径很难测试。


我认为 *alloc 函数在请求的内存超过可用内存时返回 NULL,以前的代码可以安全使用吗?

不要假设。 如果新大小比以前更大、相同或更小,则realloc()可能会返回。NULL


设计考虑:

当大小减小时返回NULL是合理的:1)满足内存句柄的数量(系统可能只允许这么多分配)并且可能暂时需要另一个。2)新的大小为0。返回值的细节有历史,有点争议,这里不再讨论。realloc()calloc()*alloc(0)

在任何情况下,只要新大小大于零,返回 就NULL意味着某些资源在末尾。 奥卡姆剃刀建议代码继续进行与由于大小增长而calloc()返回时相同的错误处理。NULL


推荐阅读