Vic*_*tor 3 c malloc null pointers memory-management
前段时间我从互联网上下载了一个源代码.有几个malloc调用,之后没有检查NULL.据我所知,你需要在调用malloc后检查NULL.
有人在调用malloc后没有检查NULL是否有充分的理由?我错过了什么吗?
人们不会检查,因为他们很懒,这使他们的代码更加丑陋,他们不想弄清楚如何从各处的错误中恢复.
我听到一些程序员说,"如果我不能动摇一块,那么系统很快就会崩溃因为VM已经满了,那我为什么要费心去检查呢?"
我不同意.您应该检查错误,即使这意味着只记录错误并调用exit()或抛出异常.虽然我们趋向于拥有巨大磁盘和永远在线分页存储器的系统,但业界已经出现问题,现在我们拥有内存有限且没有按需分页的智能手机和平板电脑.甚至在桌面上我们的数据集也增长了很多,有时malloc会失败.
如果您不想在任何地方添加额外的代码行,只需编写自己的malloc替换函数,调用malloc并检查错误并使用它而不是malloc.
正如Jens Gustedt在评论中提到的那样,当时malloc()返回一个错误,你的程序可能已经陷入了一堆麻烦.当程序很可能无论如何都无法做任何事情时,放入一堆错误处理代码来处理这种情况是否有意义?对于许多程序,答案可能是"不",对于其他程序,做一些适当的事情可能非常重要.
您可以尝试通过简单的"malloc-or-die"包装函数来分配内存,以保证分配成功或程序将终止:
void* m_malloc(size_t size)
{
void* p;
// make sure a size request of `0` doesn't trigger
// an error situation needlessly
if (size == 0) size = 1;
p = malloc(size);
if (!p) {
// attempt to log the error or whatever
abort();
}
return p;
}
Run Code Online (Sandbox Code Playgroud)
然后遇到的一个问题是除了可能终止程序之外,你可以做的事情并不多.即使记录问题也可能需要一些内存分配,因此日志记录工具可能会有自己的问题(除非您的分配失败是由于尝试分配一个不合理的大块内存).
您可以尝试通过在程序的早期分配一个"故障安全"块来解决该问题,当您需要记录问题时可以释放(我认为有很多程序使用此策略).但是,您愿意为这种错误处理做多少工作取决于您的具体需求.如果你的程序需要确保在malloc()返回错误时完成了一些非常复杂的事情,那么你需要有相应的安全措施来确保你能在非常低内存的情况下做这些事情.通常这意味着额外的复杂性,并且可能并不总是值得努力.