2017-09-16 63 views
2

如何检测malloc是否快速失败?如何判断malloc是否在iOS上快速失败?

最终目标是简单地分配所需的空间量,如果ios无法分配它,请向用户报告此优雅(而不是终止)。

当我尝试下面的代码,指针永远是零,错误号总是0

let pointer : UnsafeMutableRawPointer? = malloc(fileSize) 
print("errno = \(errno)") 
if (pointer == nil) { 
    print("Malloc failed") 
} 
+0

如果'malloc'失败,指针应该是'nil'。也许它在你的测试中从未失败过? –

+1

你在哪个平台上?在Linux上,您可能成为“乐观内存分配策略”的受害者:https://stackoverflow.com/a/7947888/1187415。 –

+0

平台是ios。如果我尝试通过其他方式分配相同大小的内存,它会故意大量地占用内存。也许失败发生在稍后的一些初始化过程中? – TJez

回答

1

你为什么用斯威夫特malloc,在所有?

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

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

+1

你确定'allocate()'不会遭受同样的问题吗? - OP没有提到读文件。出于任何目的分配内存缓冲区可能有很多原因。 –

+0

因为分配也没有给出失败的迹象。 – TJez

1

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