我想向 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
返回的指针,我找不到内存布局的保证(指针指向数组的第一个元素,并将在所有 future 的 Rust 版本中继续这样做)。
这里的解决方案是什么?
最佳答案
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()
时,您实际上是在返回一个指向已释放内存的指针!
关于rust - 如何将盒装切片 (`Box<[T]>` ) 传递给 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331341/