如何将 Vec<T> 转换为 C 语言友好的 *mut T?

How can I convert a Vec<T> into a C-friendly *mut T?

我有一个 Rust 库,它 return 通过 FFI 将一个 u8 数组发送给 C 调用者。该库还处理在客户端使用完数组后删除数组。库没有状态,所以客户端需要拥有这个数组,直到它传回库释放。

使用 box::from_rawboxed::into_raw 会很好,但我无法弄清楚如何将数组转换为 return 类型。

A Vec<T> 由 3 个值描述:

对于C数组来说,容量就是分配内存的大小,而长度就是数组实际包含的元素个数。两者都在计算 T 的数量。您通常需要为您的 C 代码提供这 3 个值。

如果您希望它们相等,您可以在 vector 上使用 .shrink_to_fit() 以根据分配器将其容量减少到尽可能接近其大小。

如果您将 Vec<T> 的所有权归还给您的 C 代码,请不要忘记在检索到上述 3 个值后对其调用 std::mem::forget(v),以避免其函数末尾的析构函数运行ning.

之后,您可以使用 from_raw_parts(..) 从这 3 个值创建回 Vec,如下所示:

let v = unsafe { Vec::<T>::from_raw_parts(ptr, length, capacity) };

并且当它的析构函数将 运行 时,内存将被正确释放。请注意,这 3 个值需要正确才能正确释放内存。对于Vec<u8>来说不是很重要,但是Vec的析构函数会运行根据它的length.

析构它包含的所有数据