我在 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(使用前将#替换为@)