【问题标题】:How to tell if malloc failed in swift on iOS?如何判断 malloc 是否在 iOS 上快速失败?
【发布时间】: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,你是怎么解决这个问题的?我从来没有这样做过。)

标签: ios swift malloc


【解决方案1】:

你为什么在 Swift 中使用 malloc

let pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: fileSize)

更重要的是,在什么情况下读取文件需要像这样手动分配内存? ? Foundation 提供 API 用于将文件直接读取到 Data

【讨论】:

  • 你确定allocate() 没有遇到同样的问题吗? – OP 对读取文件只字未提。出于任何目的分配内存缓冲区的原因有很多。
  • 因为 allocate 也没有给出失败的指示。
【解决方案2】:

LLVM 有一个优化,可以省略未使用的 malloc 调用。如果您的测试代码实际上不需要分配,则永远不会执行。

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多