Swift:UnsafeMutablePointer.deallocate(capacity :)与free()的互操作性

时间:2017-02-15 04:13:21

标签: c swift interop

我可以使用UnsafeMutablePointer.deallocate(capacity:)指针,其指针的内存以前是使用malloc分配的吗?即,deallocate的行为是free吗?

发生这种情况的一种情况是从Swift调用C函数时使用malloc分配内存并期望调用者稍后free()该内存。一个例子是LIBMTP_Detect_Raw_Devices函数(see here for an example use)。该函数期望调用者释放在函数内分配的内存(rawdevices)。

1 个答案:

答案 0 :(得分:2)

文档不清楚这一点,但测试表明互操作性。

在C中使用malloc(),然后在Swift中调用deallocate()并在C中尝试free()指针(反之亦然)将导致运行时错误,但代码如果只使用deallocate()free()中的一个,则会正常运行,但不会同时使用。

同样,在Swift中分配结构,然后在Swift中使用deallocate(),在C中使用free()(或者反过来)也会导致运行时错误。

根据@jtbandes的建议,在Swift中使用free()也是可以的。实际上,这种方法可能比调用deallocate()更安全。

至于文档,请参阅https://developer.apple.com/reference/swift/unsafemutablepointer

此外,您可以在此处浏览UnsafeMutablePointer的源代码:https://github.com/apple/swift/blob/master/stdlib/public/core/UnsafePointer.swift.gyb

我还没有时间弄清楚实施情况。