如何在不消耗它的情况下获取盒子的原始指针?
我需要将指向结构的原始指针传递给 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