如何将盒装切片(`Box< [T]>`)传递给C函数?

时间:2016-09-05 13:10:26

标签: rust heap-memory ffi

我想向C函数公开一个“动态数组”。 C函数将拥有数据,稍后将调用我的函数来释放数据。所以它看起来像下面这样:

fn get_something(len: *mut usize) -> *mut u8;
fn dealloc_something(data: *mut u8, len: usize);

我在内部有一个Box<[T]>my_vec.to_boxed_slice())。我可以很容易地得到大小/长度,但我不知道应该返回哪个指针。如果我将从boxed_slice.as_mut_ptr()返回的指针传递给Box::from_raw(),则应用程序崩溃。但是,如果我传递从Box::into_raw返回的指针,我找不到内存布局的保证(指针指向数组的第一个元素,并将继续为所有未来的Rust版本执行此操作)。 / p>

这里有什么解决方案?

1 个答案:

答案 0 :(得分:2)

Box::into_raw返回指向已分配存储开头的指针。切片是内存中连续的项目序列。因此,指针指向切片中的第一个项目。如果Box::into_raw返回了其他任何内容,那么它就不会真正有用。

boxed_slice.as_mut_ptr()Box::into_raw之间的主要区别在于Box::into_raw取得了该框的所有权但未取消分配,而boxed_slice.as_mut_ptr()只返回指针的副本,将Box的所有权保留给您的函数,因此编译器会在返回之前隐式删除它。这意味着当您使用boxed_slice.as_mut_ptr()时,您实际上是返回一个指向已释放内存的指针!