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