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能派生或实现Unpintrait,优先使用pin.into_inner()替代into_inner_unchecked,避免额外的unsafe风险。 - 一旦通过
Box::from_raw恢复所有权,该原始指针就不能再被其他代码使用,否则会引发双重释放问题。
内容的提问来源于stack exchange,提问作者py_ios_dev
相关产品推荐
相关产品推荐

