如何将一个值的所有权从 Rust 转移到 C 代码?

2024-01-01

我正在尝试使用 FFI 编写一些 Rust 代码,其中涉及 C 获取结构的所有权:

fn some_function() {
    let c = SomeStruct::new();
    unsafe {
        c_function(&mut c);
    }
}

I want c_function取得所有权c。在 C++ 中,这可以通过以下方式实现release的方法unqiue_ptr。 Rust 中有类似的东西吗?


The std::unique_ptrC++中的类型对应于Box在铁锈中,以及.release() 对应于Box::into_raw https://doc.rust-lang.org/std/boxed/struct.Box.html#method.into_raw.

let c = Box::new(SomeStruct::new());
unsafe {
    c_function(Box::into_raw(c));
}

请注意,C 函数应将指针的所有权返回给 Rust 以销毁该结构。使用C释放内存是不正确的free或 C++ 的delete.

pub unsafe extern "C" fn delete_some_struct(ptr: *mut SomeStruct) {
    // Convert the pointer back into a Box and drop the Box.
    Box::from_raw(ptr);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将一个值的所有权从 Rust 转移到 C 代码? 的相关文章

随机推荐

  • 在 Scala 工作表中使用自定义枚举时收到错误:java.lang.ExceptionInInitializerError

    UPDATE 2014年9月17日 事实证明 即使先前更新 从 2013 年 2 月 19 日起 中的解决方案无法工作如果一个地方println Value Player2 作为第一个命令 即序数仍然分配不正确 从那以后我创建了一个可验证的
  • Google Play 分阶段推出并修改了屏幕截图

    使用 Google Play 分阶段推出选项 我可以向一小部分用户发布 Android 应用的新版本 根据它的成功程度 我会在给定时间内增加百分比 我假设 因为我找不到记录 如果我将应用程序推广到 10 那么该应用程序的新用户和现有用户都会
  • 使用 nil 合并运算符缩短编译时间

    读完后article https habrahabr ru post 283106 关于快速编译时间 我感兴趣的是为什么使用超过 2 个序列合并运算符会显着增加编译时间 例子 编译时间 3 65 秒 func fn gt Int let a
  • 如何创建自定义 Symfony2 Twig 表单模板块

    我正在开发一个项目 我需要一些自定义表单模板块 不是现有块的修改版本 而是新块 我已经能够创建新的块并让 Symfony Twig 识别和使用它们 但有限制 表单模板块似乎有严格的命名约定 看来模板名称必须恰好包含一个下划线 下划线之前的单
  • Python tkinter 列表框绑定 仅在第二次单击时有效

    如果有其他讨论已经解决了这个问题 我预先表示歉意 但我找不到任何东西 我是 Python 新手 除了 90 年代的一点点 Pascal 之外 我也是编程新手 我正在构建一个带有 tk 输入框的 GUI 供用户输入值 然后将其存储在 sqli
  • Android RecyclerView - 多个Edittext同时更改

    我有一个RecyclerView有很多张牌可以容纳 4EditText 当我在其中输入值时EditText一张卡的值会在随机卡中填充相同的值 令人惊讶的是它不会跳EditText例如 如果我输入值edittext1 of card1它会将相
  • 如何在 Android RecyclerView 上对字符串进行排序?

    我有一个充满 CardView 的 recyclerView 它有 2 个参数 它们都是字符串 其中之一是标题 我想要一个按钮来根据标题按字母顺序对它们进行排序 因为它没有太多元素 所以我决定使用插入排序 即 o n 2 这是我的实现 pu
  • Spring Boot中处理嵌入式Tomcat异常

    我们遇到嵌入式 Tomcat 抛出的问题IllegalArgumentException来自LegacyCookieProcessor 它抛出 500 HTTP 响应代码 我们需要处理异常并对其执行某些操作 具体来说 将其作为 400 发送
  • Android中TextView的TextAppearance属性

    我正在开发我正在使用的 Android 应用程序TextView在屏幕上显示文本 我将此属性用于TextView设置文本的大小android textAppearance android attr textAppearanceMedium
  • 使用 Cognito 令牌访问 S3 时收到“AccessDenied”

    我正在尝试在存储桶上使用 listObjects 操作 这是通过 WebService 访问的 我不想授予用户控制台访问权限 角色政策 Version 2012 10 17 Statement Effect Allow Action mob
  • U2Net模型在android中的使用

    我按照以下步骤将原始 u2net 模型权重文件 u2net pth 转换为tensorflow lite说明 https qiita com PINTO items ed06e03eb5c007c2e102 就转换成功了 但是我在tenso
  • 了解分段错误的堆栈跟踪

    我正在做一个snprintf并出现段错误 当我像这样在 gdb 上加载核心文件时 gdb my executable core 并做了bt为了获得回溯 我得到了以下内容 Program terminated with signal 11 S
  • 构建 OpenAPI 响应,包括 oneOf 或 allOf

    我正在尝试使用 OpenAPI 3 从各种架构组件构建响应 响应基本上分为三个部分 其他端点使用的共享组件 即成功 失败标志 components schemas core response schema inside allOf 属性al
  • 用 Angular 上传文件?

    我知道这是一个非常普遍的问题 但我无法在 Angular 2 中上传文件 我努力了 1 http valor software com ng2 file upload http valor software com ng2 file upl
  • 将用户控件与 ViewModel 类关联

    当我定义一个DataTemplate内联 Visual Studio 知道我要绑定的类型 并且该类型中的属性会在自动完成中出现 例如 在下面的代码中 我可以选择DisplayName从里面的自动完成列表FirstViewModel模板
  • jQuery 同时切换“幻灯片”和“淡入淡出”动画

    jQuery 有一个slideToggle and a fadeToggle 但他们在一起玩得不好 参见小提琴here http jsfiddle net Y2yvd div on click function span slideTogg
  • Spring Boot 自定义错误页面堆栈跟踪

    我在几个位置找到了如何使用 Spring boot 制作自定义错误页面 但我似乎无法弄清楚如何使其显示堆栈跟踪 这就是我所拥有的 Bean public EmbeddedServletContainerCustomizer containe
  • 从 WooCommerce 中的 apply_filters('prefix_xml_feeds_productname_variant') 函数获取数据

    我对 WordPress 和 WooCommerce 完全陌生 所以对糟糕的解释表示歉意 我有这个代码 text apply filters prefix xml feeds productname variant text product
  • 使用java代码计算S3上文件的行数

    使用java代码 是否可以计算AWS s3上文件的行数 而无需将其下载到本地计算机 取决于你所说的下载是什么意思 S3 中没有远程处理 您无法上传将在 S3 服务中执行的代码 可能的替代方案 如果问题是文件太大而无法存储在内存或本地磁盘中
  • 如何将一个值的所有权从 Rust 转移到 C 代码?

    我正在尝试使用 FFI 编写一些 Rust 代码 其中涉及 C 获取结构的所有权 fn some function let c SomeStruct new unsafe c function mut c I want c function