rust - 如何将盒装切片 (`Box<[T]>` ) 传递给 C 函数?

标签 rust heap-memory ffi

我想向 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/

相关文章:

node.js - 错误: Cannot find module 'ffi' compiling ElectronJS project

c - 如何在 Rust 中表示指向 C 数组的指针?

rust - 预期的向量但找到了结构集合::vec::Vec

rust - 不可变对象(immutable对象)根据函数签名更改为可变对象

c++ - 访问堆中的数据比访问栈中的数据快吗?

c - 堆 block 修改了过去请求的大小 2 C 中的错误

json - 反序列化不规则内容的JSON

rust - 从 ZIP 存档中打开单个文件并作为 Read 实例传递

java - 继承技术如何运作?

c# - 使用FFI将字符串从C#传递到Rust