我可以依赖 malloc 返回 NULL 吗?

2024-03-05

我在 Unix 系统上读到过,malloc即使内存实际上不可用,也可以返回非 NULL 指针,并且稍后尝试使用该内存将触发错误。由于我无法通过检查 NULL 来捕获此类错误,因此我想知道检查 NULL 到底有多大用处?

在相关的说明中,Herb Sutter 表示,处理 C++ 内存错误是徒劳的,因为在异常实际发生之前,系统就会陷入分页痉挛。这是否适用于malloc还有?


Quoting Linux手册 http://linux.die.net/man/3/malloc:

默认情况下,Linux 遵循乐观的内存分配策略。这意味着当malloc()返回非NULL没有 保证 内存确实可用。这是一个非常糟糕的错误。万一发现系统内存不足,一个或多个 流程将是 被臭名昭著的 OOM 杀手杀死。如果在不希望突然丢失的情况下使用Linux 一些随机的 选择的进程,而且内核版本足够新,可以关闭这种过度使用行为 使用如下命令:

# echo 2 > /proc/sys/vm/overcommit_memory

你应该检查一下NULL尤其是在 32 位系统上,因为进程地址空间可能会在 RAM 之前耗尽:例如,在 32 位 Linux 上,用户进程可能具有 2G - 3G 的可用地址空间,而不是超过 4G 的总 RAM。在 64 位系统上,检查malloc返回代码,但无论如何可能被认为是好的做法,并且它确实使您的程序更加可移植。并且,请记住,取消引用空指针肯定会杀死您的进程;与此相比,一些交换可能不会造成太大伤害。

If malloc碰巧返回NULL当尝试仅分配少量内存时,则在尝试从错误条件中恢复时必须小心,因为任何后续操作都会导致错误发生。malloc也可能会失败,直到有足够的内存可用。

默认的 C++ 运算符new通常是对相同分配机制的包装malloc().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以依赖 malloc 返回 NULL 吗? 的相关文章

随机推荐