首页 文章

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

提问于
浏览
1

我想向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版本执行此操作) .

这里有什么解决方案?

1 回答

  • 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() 时,你实际上是返回一个指向释放内存的指针!

相关问题