我已经将大量的 C 代码行用于清理标签/条件以用于失败的内存分配(由alloc
返回的系列表示NULL
)。我被告知这是一种很好的做法,因此,在内存故障时,可以标记适当的错误状态,并且调用者可以潜在地执行“优雅的内存清理”并重试。我现在对这种哲学有一些疑问,我希望能澄清一下。
我想调用者可能会释放过多的缓冲区空间或剥离其数据的关系对象,但我发现调用者很少有能力(或处于适当的抽象级别)这样做。此外,从被调用函数中提前返回而没有副作用通常很重要。
我还刚刚发现了 Linux OOM 杀手,这似乎使这些努力在我的主要开发平台上毫无意义。
默认情况下,Linux 遵循乐观的内存分配策略。这意味着当 malloc() 返回非 NULL 时,不能保证内存确实可用。这是一个非常糟糕的错误。如果发现系统内存不足,一个或多个进程将被臭名昭著的 OOM 杀手杀死。
我认为可能还有其他平台遵循相同的原则。是否有一些实用的东西使得检查 OOM 条件值得?