2016-09-05 24 views
1

我想暴露一个“动态数组”到C函数。 C函数将拥有数据,稍后将调用我的函数来释放数据。所以它会看起来像下面这样:如何将一个盒装切片(`Box <[T]>`)传递给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::into_raw返回的指针,我无法找到内存布局的保证(指针指向数组的第一个元素,并且将继续为所有未来的Rust版本这样做)。

这里有什么解决方案?

回答

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

+0

_这意味着当你使用'boxed_slice.as_mut_ptr()'时,你基本上返回一个指向释放内存_...的指针,实际上我使用的是'mem :: forget',但这并不重要。 – vinipsmaker

+0

你可以将我链接到这种内存布局的参考吗? 'Box :: into_raw'会返回一个指向第一个元素的指针?如果这是真的,我的问题就回答了,我不需要再问任何其他问题。 – vinipsmaker

+1

“切片是一个视图,表示为指针和长度的内存块。” [DOC](https://doc.rust-lang.org/std/slice/)。片数据的存储器布局未指定。您需要调用slice上的'as_mut_ptr'来获取有效的数据指针。 –

相关问题