You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何将堆上固定对象的原始指针转回原类型?

如何将原始指针转换回原对象类型

你的代码把Pin<Box<SomeObject>>包裹在额外的Box中,再转换为原始指针并强转为jlong。逆向转换需要逐层还原,且所有操作必须在unsafe块中执行(因为原始指针操作和所有权恢复属于不安全行为)。

假设SomeObject是你的目标类型,具体转换代码如下:

// 1. 将jlong转回与into_raw时匹配的原始指针类型
let raw_ptr = raw_pointer as *mut Pin<Box<SomeObject>>;

unsafe {
    // 2. 用Box::from_raw恢复Box的所有权,这会接管指针指向的内存
    let boxed_pin = Box::from_raw(raw_ptr);
    // 3. 解包Box得到Pin<Box<SomeObject>>
    let pin = *boxed_pin;
    // 4. 提取Pin内部的Box<SomeObject>
    // 若SomeObject实现了Unpin,可替换为pin.into_inner()(无需unsafe)
    // 注意:into_inner_unchecked要求对象自pin后从未被移动,否则会触发未定义行为
    let boxed_obj = pin.into_inner_unchecked();
    // 5. 解包Box得到最终的SomeObject
    let some_object = *boxed_obj;
}

关键注意事项

  • 必须保证raw_pointer是有效且未被释放的指针,且确实指向当初用Box::into_raw创建的对象,否则会导致未定义行为。
  • 如果SomeObject能派生或实现Unpin trait,优先使用pin.into_inner()替代into_inner_unchecked,避免额外的unsafe风险。
  • 一旦通过Box::from_raw恢复所有权,该原始指针就不能再被其他代码使用,否则会引发双重释放问题。

内容的提问来源于stack exchange,提问作者py_ios_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:52:50