在 Swift 中创建一个字符串缓冲区供 C 稍后使用和释放

标签 c swift ffi

对于那些了解 Rust 的人来说,问题的快速形式是: 是否有一个相当于 std::ffi::CString 的 Swift 5可以拥有一个 String 并将其转换为 char*into_raw然后使用类似 from_raw 来释放/删除它?

更长的版本:

我有一个在 Swift 中使用的 C API。我必须提供一个回调函数,我将其作为闭包参数提供,并且该闭包必须返回一个以 null 结尾的字符串作为 const char * — 在 Swift 中,输入为 UnsafePointer<Int8>? .

显然,必须有人对该内存以及何时释放它负责。在这种情况下,我想说它是堆分配的,Swift 负责它,并且它将保留 const char *一直存在,直到 C 接口(interface)完成它并调用某种 free()功能。

在用 UTF-8 字符串初始化的 Swift 中分配一些内存的最简单的方法是什么,提供 const char *到 C,然后根据指示释放它?

最佳答案

两种可能的选择:

let swiftString = "Hello world"
swiftString.withCString { cStringPtr in
    // use `cStringPtr` ...

}

使用 Swift 字符串(UTF-8 编码)的 C 字符串表示形式的指针调用闭包。该指针仅在闭包执行期间有效。

为了延长使用生命周期,您可以这样做

let swiftString = "Hello world"
let cStringPtr = strdup(swiftString)
// use `cStringPtr` ...

它从给定的 Swift 字符串中分配一个新的 C 字符串,并稍后释放该内存

free(cStringPtr)

关于在 Swift 中创建一个字符串缓冲区供 C 稍后使用和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55933537/

相关文章:

c - 在 C 结构中强制填充

c - c中的霍尔快速排序

c - 原型(prototype)线程协同例程: send concatenated boolean to macro

XCode 项目导航器错误

c - 为外部 C 库分配不透明缓冲区的正确 Rust 方法是什么?

c - 从 Rust 到 C 的原始指针变为空

c - Linux:如何找到持有特定锁的线程?

swift - Int 没有成员 multiplyReportingOverflow

ios - 如何从另一个 View Controller 加载webview?

pointers - Rust - 包装 FFI 指针