我想向 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()
to Box::from_raw()
,应用程序崩溃。但是,如果我传递从返回的指针Box::into_raw
,我找不到内存布局的保证(指针指向数组的第一个元素,并且对于所有未来的 Rust 版本将继续这样做)。
这里有什么解决办法呢?
Box::into_raw
返回指向已分配存储空间开头的指针。切片是内存中连续的项目序列。因此,指针指向切片中的第一项。如果Box::into_raw
返回任何其他东西,它不会真正有用。
之间的主要区别boxed_slice.as_mut_ptr()
and Box::into_raw
就是它Box::into_raw
取得该盒子的所有权,但不取消分配它,而boxed_slice.as_mut_ptr()
只返回指针的副本并保留该指针的所有权Box
到您的函数,因此编译器在返回之前隐式删除它。这意味着当您使用boxed_slice.as_mut_ptr()
,您本质上是返回一个指向已释放内存的指针!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)