【发布时间】:2018-02-25 16:40:27
【问题描述】:
如何快速检测 malloc 是否失败?
最终目标是简单地分配所需的空间量,如果 ios 无法分配,请优雅地向用户报告(而不是被终止)。
当我尝试下面的代码时,指针永远不会是 nil 并且 errno 始终是 0。
let pointer : UnsafeMutableRawPointer? = malloc(fileSize)
print("errno = \(errno)")
if (pointer == nil) {
print("Malloc failed")
}
【问题讨论】:
-
如果
malloc失败,指针应该是nil。也许它在您的测试中从未失败过? -
你在什么平台上?在 Linux 上,您可能是“乐观内存分配策略”的受害者:stackoverflow.com/a/7947888/1187415。
-
平台是ios。这是故意大量的内存,如果我尝试通过其他方式分配相同大小的内存,它会失败。也许失败发生在稍后的一些初始化过程中?
-
根据mikeash.com/pyblog/… 的说法,iOS 上的 malloc 也使用了“乐观内存分配策略”。这意味着您可以获得一个指针,但稍后使用内存可能会崩溃。使用
calloc()代替可能是一个解决方案。 -
当我记得上次我走这条路时,
calloc也无济于事,因为它用 0 填充,而且内存系统足够智能,可以让全 0 页面未映射。 IIRC,即使您分配的块是可写的,但这并不意味着当您尝试编写它时每个页面都是可映射的,因此您可能会崩溃。你当然可以用非 0 值填充内存来强制它被映射,但如果你错了就会崩溃。 (那么,Rob,你是怎么解决这个问题的?我从来没有这样做过。)