[英]How can I convert a Vec<T> into a C-friendly *mut T?
我有一个Rust库,它通过FFI将一个u8
数组返回给一个C调用者。 该库还在客户端完成后处理数组。 该库没有状态,因此客户端需要拥有该数组,直到它被传递回库以供释放。
使用box::from_raw
和boxed::into_raw
会很好,但我boxed::into_raw
如何将数组转换为返回类型的问题。
Vec<T>
由3个值描述:
.as_mut_ptr()
获得 .len()
获得 .capacity()
获得 就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.