如何在不消耗它的情况下获取盒子的原始指针?

我需要将指向结构的原始指针传递给 C++,然后仍然想使用该框。

我找到了into_raw函数,但它吃掉了这个盒子,我不能再在 Rust 中使用那个盒子了。有没有办法得到一个*const T?我可以const_cast在 C++ 方面侥幸逃脱。

这就是我想要做的:

let handle_ptr = Box::<Handle>::into_raw(handle);            
     
     
std::thread::spawn(move || {            
    let rt = tokio::runtime::Builder::new_current_thread()            
        .build()            
        .unwrap();             
     
    rt.block_on( handle.run() );            
});            
     
return handle_ptr

我知道这是不安全的,但我不知道任何其他方法可以允许在其他线程上运行的 C++ 代码调用 Rust 对象的线程安全方法。

回答

您可以取消引用该框并将对其内容的引用转换为原始指针:

let handle_ptr: *const Handle = &*handle;

或者:

let handle_ptr = &*handle as *const Handle;

请注意,您还没有使用过unsafe。您需要使用unsafe来取消引用此指针,包括将其传递给您的 C++ 函数。当您使用unsafe编译器不能帮助你,这是由你来确保未定义行为不会被触发,其中包括检查安全代码,会影响在不安全的代码访问的内存。

在这种情况下,您的 C++ 函数可能会在删除框后使用指针(释放后使用)。因此,您需要确保不会发生这种情况。


有关原始指针,请参阅文档中的示例:

  • https://doc.rust-lang.org/std/primitive.pointer.html#common-ways-to-create-raw-pointers

以上是如何在不消耗它的情况下获取盒子的原始指针?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>