问我听说有些操作系统实际上并不会分配malloc分配的内存,直到程序试图使用它。这合法吗?
答很难说。标准并没有说系统可以这样做,但也没有明确禁止它们这样做。(这种“延迟失败”的实现似乎不符合标准的隐含要求。)
显而易见的问题是,当程序最终试图使用内存时,可能已经没有内存了。在这种情况下,程序通常必须被操作系统终止,因为 C 的语义没有提供补救措施。(显然,malloc应该在没有内存时返回一个空指针,这样程序——只要检查malloc的返回值——就不会尝试使用比可用内存更多的内存。)
进行“惰性分配”的系统通常会提供额外的信号来指示内存已严重不足,但可移植或简单的程序不会捕获它们。一些进行惰性分配的系统还提供了一种关闭它的方法(恢复到传统的malloc语义),这是按进程或按用户进行配置的,但具体细节因系统而异。
其他链接:关于“惰性分配”的权衡的更长的解释
参考:ISO Sec. 7.10.3