我能确定重新分配更少的内存总能找到足够的内存吗?
Can I be sure that reallocating less memory will always find enough of it?
假设我刚刚 malloc
ed 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
函数 return NULL
当请求的内存超过可用内存时,以前的代码可以安全使用吗?
Can I be sure that reallocating less memory will always find enough of it?
Can I make that and yet be sure that my realloc will find enough memory?
不,realloc(p, 5);
可能会失败并且 return NULL
。
Should I make sure p_ isn't NULL even though I have reallocated less memory than the original one?
是的,代码,当缩减并且return是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
路径通常很难测试。
I think *alloc functions return NULL when the requested memory exceeds the available one, is the previous code safe to use?
不要假设。 realloc()
可能 return NULL
如果新尺寸比以前更大、相同或更小。
设计考虑:
当大小减小时在 realloc()
上返回 NULL
是合理的,当 1) 满足内存 句柄 的数量(系统可能只允许如此多的分配)和 calloc()
可能暂时需要另一个。 2) 新的大小为0。*alloc(0)
上的return值的细节有历史,有点争议,这里不做进一步讨论。
在任何情况下,只要新大小大于零,NULL
的 return 就意味着末尾有一些资源。 Occam's razor 建议代码进行与 calloc()
returns NULL
由于大小增长时相同的错误处理。
假设我刚刚 malloc
ed 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
函数 return NULL
当请求的内存超过可用内存时,以前的代码可以安全使用吗?
Can I be sure that reallocating less memory will always find enough of it?
Can I make that and yet be sure that my realloc will find enough memory?
不,realloc(p, 5);
可能会失败并且 return NULL
。
Should I make sure p_ isn't NULL even though I have reallocated less memory than the original one?
是的,代码,当缩减并且return是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
路径通常很难测试。
I think *alloc functions return NULL when the requested memory exceeds the available one, is the previous code safe to use?
不要假设。 realloc()
可能 return NULL
如果新尺寸比以前更大、相同或更小。
设计考虑:
当大小减小时在 realloc()
上返回 NULL
是合理的,当 1) 满足内存 句柄 的数量(系统可能只允许如此多的分配)和 calloc()
可能暂时需要另一个。 2) 新的大小为0。*alloc(0)
上的return值的细节有历史,有点争议,这里不做进一步讨论。
在任何情况下,只要新大小大于零,NULL
的 return 就意味着末尾有一些资源。 Occam's razor 建议代码进行与 calloc()
returns NULL
由于大小增长时相同的错误处理。