Rust 如何暴露锈迹'Vec<;T>;`去外国金融机构?
我试图构造一对元素:Rust 如何暴露锈迹'Vec<;T>;`去外国金融机构?,rust,ffi,Rust,Ffi,我试图构造一对元素: 数组:*mut T T array\u len:usize 数组用于拥有数据 但是,将返回*mut[T]。我找不到任何有关将原始指针转换为切片的信息。它在内存中的布局是什么?如何从C使用它?我应该转换为*mut T?如果是,如何获取?您可以直接从Vec、框或任何其他切片类型获取*mut T指针 use std::mem; let mut boxed_slice: Box<[T]> = vector.into_boxed_slice(); let arra
数组:*mut T T
array\u len:usize
数组
用于拥有数据
但是,将返回*mut[T]
。我找不到任何有关将原始指针转换为切片的信息。它在内存中的布局是什么?如何从C使用它?我应该转换为*mut T
?如果是,如何获取?您可以直接从Vec
、框
或任何其他切片类型获取*mut T
指针
use std::mem;
let mut boxed_slice: Box<[T]> = vector.into_boxed_slice();
let array: *mut T = boxed_slice.as_mut_ptr();
let array_len: usize = boxed_slice.len();
// Prevent the slice from being destroyed (Leak the memory).
mem::forget(boxed_slice);
使用std::mem;
让mut boxed_slice:Box=vector.into_boxed_slice();
let数组:*mut T=box_slice.as_mut_ptr();
让数组_len:usize=boxed_slice.len();
//防止片被破坏(泄漏内存)。
mem::忘记(盒装切片);
如果您只想让某个C函数可变地借用Vec
,您可以这样做:
extern "C" {
fn some_c_function(ptr: *mut i32, len: ffi::size_t);
}
fn safe_wrapper(a: &mut [i32]) {
unsafe {
some_c_function(a.as_mut_ptr(), a.len() as ffi::size_t);
}
}
use std::mem;
extern "C" {
fn c_sink(ptr: *mut i32, len: ffi::size_t);
}
fn sink_wrapper(mut vec: Vec<i32>) {
vec.shrink_to_fit();
assert!(vec.len() == vec.capacity());
let ptr = vec.as_mut_ptr();
let len = vec.len();
mem::forget(vec); // prevent deallocation in Rust
// The array is still there but no Rust object
// feels responsible. We only have ptr/len now
// to reach it.
unsafe {
c_sink(ptr, len as ffi::size_t);
}
}
当然,C函数不应该将该指针存储在其他地方,因为这将打破别名假设
如果要将数据的所有权“传递”给C代码,可以执行以下操作:
extern "C" {
fn some_c_function(ptr: *mut i32, len: ffi::size_t);
}
fn safe_wrapper(a: &mut [i32]) {
unsafe {
some_c_function(a.as_mut_ptr(), a.len() as ffi::size_t);
}
}
use std::mem;
extern "C" {
fn c_sink(ptr: *mut i32, len: ffi::size_t);
}
fn sink_wrapper(mut vec: Vec<i32>) {
vec.shrink_to_fit();
assert!(vec.len() == vec.capacity());
let ptr = vec.as_mut_ptr();
let len = vec.len();
mem::forget(vec); // prevent deallocation in Rust
// The array is still there but no Rust object
// feels responsible. We only have ptr/len now
// to reach it.
unsafe {
c_sink(ptr, len as ffi::size_t);
}
}
因为
Vec::from_raw_parts
需要三个参数,一个指针、一个大小和一个容量,所以我们要么以某种方式跟踪容量,要么在将指针和长度传递给C函数之前使用Vec的shrink__fit
。不过,这可能涉及重新分配。一旦向量
被销毁,数组
是否有效?这个想法是array
将拥有数据(我将更新这个问题)。@vinipsmaker:不。因此,请不要让向量被破坏,忘记它。请参阅更新。抱歉,我不知道在这种方法中释放代码是如何工作的<代码>放入已装箱的切片
将返回。。。内存中的布局是什么<代码>已装箱的切块。as_mut_ptr()保证返回指向第一个字符的指针吗?如何转换回框
,以便取消分配?@vinipsmaker:(1)未指定布局。当前实现使用(ptr,len)
。(2) 也许你应该问一个新问题。但是你可以尝试slice::from_raw_parts_mut
和Box::from_raw
,或者使用Vec::from_raw_parts
,但是你也需要传递容量。在这里slice::from_raw_parts
+Box::from_raw
可以吗?Box::from_raw
不是在获取指向堆栈分配的片而不是原始片的指针吗?或者Box
是一个特例?这就是我最后使用的:。除了断言代码>,我正在考虑使用它,但我没有足够的信心/说服力。