如何将盒装切片(`框<[T]>`)传递给一个C函数?(How to pass a box

2019-09-28 15:38发布

我要揭露一个“动态数组”的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 ,我无法找到的内存布局保证(指针指向数组的第一个元素,并会继续为所有未来版本锈这样做)。

这里有什么解决办法?

Answer 1:

Box::into_raw返回一个指向分配存储的开始。 切片是在存储器项的连续序列。 因此,指针指向在片中的第一项。 如果Box::into_raw否则返回任何东西,它不会是真正有用的。

之间的主要区别boxed_slice.as_mut_ptr()Box::into_rawBox::into_raw采取箱子的所有权,但并没有释放它,而boxed_slice.as_mut_ptr()刚刚返回指针的拷贝和离开的所有权Box你的函数,所以编译器隐式返回之前丢弃。 这意味着,当您使用boxed_slice.as_mut_ptr()你基本上是返回一个指针,以释放内存!



文章来源: How to pass a boxed slice (`Box<[T]>`) to a C function?