c - 我可以确定重新分配更少的内存总能找到足够的内存吗?
问题描述
假设我刚刚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
,以前的代码可以安全使用吗?
解决方案
我可以确定重新分配更少的内存总能找到足够的内存吗?
我可以做到这一点,但确保我的 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
推荐阅读
- python - 如何将 cliente_id ForeignKey 添加到 CreateView ?创建视图
- php - 来自functions.php的Woocommerce条件is_product()
- apache-kafka - 使用 SpringCloudStream 时如何在 Kafka 记录级别进行消息过滤?
- openedge - 如何获取正在进行的所有模式列表-openedge SQL 查询
- apache2 - mod_pagespeed 不再重写资源
- python - Python3 中 sorted() 和 heapq 函数的性能
- javascript - Vue 有条件地加载 Vue.use 插件
- c++ - 我们可以使用前序或后序遍历而不是中序遍历将树转换为双向链表吗?
- mysql - 如何从 mysql 中的 txt 自动创建数据库表?
- idl - IDL 和图像格式