Rust:DLL 输出对象的生命周期管理

在 Rust 开发 DLL 时安全地将对象地址传递给 C 语言并保持对象不被析构,需要正确处理所有权和生命周期。以下是详细方案和代码示例:

核心思路

  1. 堆分配对象 - 使用 Box 在堆上分配对象
  2. 泄漏所有权 - 使用 Box::into_raw 防止 Rust 自动析构
  3. 明确所有权协议 - 提供销毁函数由 C 语言调用方管理生命周期
  4. 线程安全 - 使用 Send + Sync 确保跨线程安全

完整示例

Rust DLL 实现
// src/lib.rs
use std::sync::Mutex;

#[repr(C)]
pub struct Counter {
   
   
    value: Mutex<i32>,  // 内部可变性保证线程安全
}

impl Counter {
   
   
    pub fn new(init: i32) -> Self {
   
   
        Counter {
   
   
            value: Mutex::new(init),
        }
    }

    pub fn increment(&self) {
   
   
        let mut lock = self.value.lock().unwrap();
        *lock += 1;
    }

    pub fn get_value(&self) -> i32 {
   
   
        *self.value.lock().unwrap()
    }
}

// 创建对象并返回指针 (所有权转移给调用方)
#[no_mangle]
pub extern "C" fn counter_create(init: i32) -> *mut Counter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值