繁体   English   中英

我怎样才能转换Vec <T> 进入C友好* mut T?

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

我有一个Rust库,它通过FFI将一个u8数组返回给一个C调用者。 该库还在客户端完成后处理数组。 该库没有状态,因此客户端需要拥有该数组,直到它被传递回库以供释放。

使用box::from_rawboxed::into_raw会很好,但我boxed::into_raw如何将数组转换为返回类型的问题。

Vec<T>由3个值描述:

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

如果你希望它们是等号,你可以在向量上使用.shrink_to_fit()来尽可能地减小其容量,具体取决于分配器。

如果你将Vec<T>的所有权归还给你的C代码,一旦你检索了之前描述的3个值,就不要忘记在它上面调用std::mem::forget(v) ,以避免它的析构函数在函数结束时运行。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM