malloc
使用except在内存分配过程中可能发生的错误是什么out of memory
?处理这些错误的最佳策略是什么?
out of memory exception
即使内存分配失败,是否有必要释放指针?
malloc
使用except在内存分配过程中可能发生的错误是什么out of memory
?处理这些错误的最佳策略是什么?
out of memory exception
即使内存分配失败,是否有必要释放指针?
在 C 中没有例外(无论如何您都不能在语言中使用),因此malloc
发出失败信号的唯一方法是返回空指针。所以你必须检查返回值。如果为 0,则分配失败(无论出于何种原因)并且没有分配内存 - 没有可释放的内存;否则请求数量(*)的分配成功,您将不得不在不再需要时释放内存。
(*) 小心溢出:malloc
接受一个size_t
参数,该参数很可能是一个无符号数。如果您请求size * sizeof(int)
带无符号size
的字节并且乘法溢出(可能在获取 的值时出错size
),则结果是一个小数字。 malloc()
将为您以非空返回分配这少量字节,并根据 的实际(大)值对返回的数组进行索引size
,可能导致分段错误或其等效项
我意识到这看起来像是一个产品插件,但您可以在我们关于CheckPointer的文章中阅读各种内存分配错误,我们的工具是查找内存管理错误,包括此类分配错误。
内存不足是唯一可检测到的错误......其他错误(例如释放已释放的内存)可能导致崩溃。
在 C 中检查内存不足的一种策略是使用 malloc 和 realloc 的包装器(您可能称它们为 xmalloc 和 xrealloc)来检查内存不足,如果是,则采取错误操作……打印一条消息并退出,或者可能试图释放内存池,然后重试分配。这将所有测试放在一个地方,产生一致的失败消息,并保证检查所有分配尝试是否失败。下面的评论中讨论了可能的缺点。
从历史上看,这种策略在 C 代码中很少见(与用这种古老语言编写的代码中的普遍低质量一致),但现在一些成熟的库框架包含了这种东西(尽管实现留下了一些期望;再次,请参阅评论以下)。另一种非常可取的方法是放弃 C 并转向更现代的语言......可能是 C++,其中任何失败都会new
导致bad_alloc
异常。
至于你的问题......如果 malloc 失败,它返回 NULL;没有指向免费的指针。(free(NULL) 是无操作的)。如果 realloc 失败,则原始分配保持不变。您可以通过阅读手册页或规范来找到这些内容,例如http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.html