如何将 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_raw
和 boxed::into_raw
会很好,但我无法弄清楚如何将数组转换为 return 类型。
A Vec<T>
由 3 个值描述:
- 指向其第一个元素的指针,可以通过
.as_mut_ptr()
获得
- 一个长度,可以用
.len()
得到
- 容量,可以通过
.capacity()
获得
对于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
.
析构它包含的所有数据
我有一个 Rust 库,它 return 通过 FFI 将一个 u8
数组发送给 C 调用者。该库还处理在客户端使用完数组后删除数组。库没有状态,所以客户端需要拥有这个数组,直到它传回库释放。
使用 box::from_raw
和 boxed::into_raw
会很好,但我无法弄清楚如何将数组转换为 return 类型。
A Vec<T>
由 3 个值描述:
- 指向其第一个元素的指针,可以通过
.as_mut_ptr()
获得
- 一个长度,可以用
.len()
得到
- 容量,可以通过
.capacity()
获得
对于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
.