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

2023-11-29

我想向 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(使用前将#替换为@)

如何将装箱切片 (`Box<[T]>`) 传递给 C 函数? 的相关文章

随机推荐

  • MSI升级并保留注册表项?

    我们在该领域有一个产品 1 0 我正在尝试更新该产品的安装程序 以便它可以安装旧版本 安装新版本 2 0 我正在使用 Visual Studio 2010 安装项目来执行此操作 我维护了 UpgradeCode 并将删除早期版本设置为 tr
  • 如何获得在C#中编辑app.config的管理员权限?

    我有一个程序 它使用 app config 来存储一些首选项 问题是 如果该程序安装在C program files 那么更改首选项是不可能的 因为所有文件程序文件 仅管理员可用 My code public static bool Edi
  • 使用 ADAL 对 Azure API 应用程序进行身份验证

    我有一个标记为 公共 已验证 的 Azure API 应用程序 并在关联的网关中设置了 Azure Active Directory 身份 详细信息请参阅保护 API 应用程序 然后 我在同一 Azure Active Directory
  • flutter 在小部件的多个实例之间共享状态

    在我的扑动应用程序中 我有一个ConnectivityStatus显示应用程序到我的树莓派的当前连接状态的小部件 在里面initState在我的小部件中 我订阅了一个计时器 每 5 秒检查一次连接并相应更新状态 然后在处理后取消订阅 问题是
  • Android Studio:com.android.ide.common.process.ProcessException:

    我正在尝试将 ArcGis 与 Android Studio 一起使用 我尝试按照以下步骤操作 https developers arcgis com android guide install and set up htm http bl
  • 刷新页面出现 404:仅在使用 /dist 文件夹时发生

    我有一个 LoopBackJS Restful 服务器运行在 localhost 3000 在前端 我有一个简单的 Angular 2 应用程序 它使用上述 API 当出现以下情况时 一切工作正常 使用nodemon运行服务器 根文件夹位于
  • 绘制熊猫时间增量

    我有一个 pandas 数据框 它有两个 datetime64 列和一个 timedelta64 列 这是两列之间的差异 我正在尝试绘制 timedelta 列的直方图以可视化两个事件之间的时间差 然而 仅仅使用df time delta
  • 如何增加Mapkit中userLocation注释的半径

    我的应用程序需要用户许可并将地图移动到该位置 默认情况下在该位置MapKit添加一个正在生成一些脉冲的蓝色图标 我到处搜索 但我发现如何添加一个 1000m 的圆圈userLocation 我不想要这样 你可以说我正在寻求定制userLoc
  • 帮助使用 int 的 TSQL IN 语句

    我正在尝试在存储过程中创建以下选择语句 dealerids nvarchar 256 SELECT FROM INVOICES as I WHERE convert nvarchar 20 I DealerID in dealerids I
  • 使用 GRPC 流请求进行代理负载平衡

    我们使用流式 RPC 将大文件发送到 GRPC 服务器 像这样 service FileReceiver rpc addData stream DataChunk returns Empty 在这种情况下是否可以使用代理负载均衡器 以便负载
  • 如何防止窗户被移动?

    我将如何阻止表格被移动 我将表单边框样式设置为 固定单一 并希望保持这种方式 因为它在 vista 中看起来不错 看看这个link 您可能对选项 3 感兴趣 它将要求您包装一些本机代码 但应该可以工作 链接底部还有一条评论 显示了一种更简单
  • 一次解析器中有多个匹配项?

    我正在尝试 还 用从日志解析的数据填充多个向量 关键是尽可能快速高效地完成 因此我想仅在一次传递中收集所有数据 而不是规则之间的 或 我发现了接下来的问题 1 每次我使用spirit 但它没有按预期工作时 我发现自己完全不知所措 并尝试了两
  • 在 Crystal Report 2008 中使用 .net 对象作为数据源

    HI all 我创建了一个 net 对象 例如 A 其中包含从表中收集的数据 接下来 我创建一个List a 并传递给SetDataSource 的方法ReportDocument目的 当我运行时 抛出了异常 CrystalDecision
  • MYSQL - 为表中的每个类别选择前 4 条记录

    我有一张桌子INVENTORY其中有其他列CATEGORY and UPDATED 按这些列对表进行排序很容易 SELECT FROM INVENTORY ORDER BY CATEGORY ASC UPDATED ASC 我想要的是获得一
  • Zend Framework - 并未显示所有错误

    在操作方法中 我有以下代码摘录 error reporting E ALL ini set display errors 1 Logger log test Logger类是这样定义的 class Logger public static
  • 为什么我的 git 推送到 HostGator 共享主机失败?

    我正在尝试将本地存储库部署到远程目录 我已经跑了git init bare在此远程目录中 并将正确的 ssh 路径添加到我的本地 git repo 分支 名为 dev git remote add server ssh email prot
  • 使用 SPARQL 获取图形路径[重复]

    这个问题在这里已经有答案了 我们有以下海龟数据集 表示我们想要观察某些属性的图表 prefix v1
  • 如何杀死Android应用程序启动的logcat进程?

    我有 Android 应用程序 在服务启动时实现以下代码 Process process Runtime getRuntime exec logcat v time s arg BufferedReader bufferedReader n
  • 我可以决定调用不存在的对象方法时会发生什么吗?

    我的代码如下所示 obj foo obj might or might not have a foo method 我想知道我是否可以覆盖发生的情况obj foo在我的代码中被调用 例如 obj foo function alert Hel
  • 如何将装箱切片 (`Box<[T]>`) 传递给 C 函数?

    我想向 C 函数公开一个 动态数组 C 函数将拥有数据 稍后将调用我的函数来释放数据 所以它看起来像下面这样 fn get something len mut usize gt mut u8 fn dealloc something dat