【发布时间】:2020-01-28 07:19:46
【问题描述】:
考虑这段代码:
main() {
float *ptr = NULL;
while(true) {
ptr = (float *)realloc(ptr, 0*sizeof(float));
fprintf(stdout,"Errno: %d, Ptr value: %d\n",errno, (int)ptr);
}
}
奇怪的是,errno 从未设置(至少对我而言),但调用交替返回 NULL 和一个指针值。我的想法是 0 分配可能会返回某种错误,但不会严重到无法设置 errno。或者带有 realloc 的代码有问题。我不确定。
我有点不在乎,但这会导致(0 字节)内存泄漏。
“Realloc 失败”问题与它在很大程度上假定从 realloc() 返回 NULL 是一个错误并不完全相同。在这种情况下并非如此。这主要是关于 realloc() 在传递零大小时的不同行为。
【问题讨论】:
-
0*... = 0 - 它应该做什么?
-
NULL 在这种情况下并不表示失败。 如果 size 为 0,则 malloc() 返回 NULL,或稍后可以成功传递给 free() 的唯一指针值 - 来自
man 3 realloc -
我需要阅读
realloc上的手册页,但您要求的内存为 0,但它没有给您,这不是错误情况,我不希望errno设置。 -
来自cppreference:“如果 new_size 为零,则行为是实现定义的(可能会返回空指针(在这种情况下,旧的内存块可能会或可能不会被释放),或者一些非可能会返回可能不用于访问存储的空指针)”。您正在分配零字节,因此您处于“依赖于实现”的领域。
-
“这导致我发生(0 字节)内存泄漏” -- 所以根本没有泄漏?