【发布时间】:2021-03-10 12:18:49
【问题描述】:
我有一个函数可以将Box::into_raw 结果转换为u64。我后来're-Box'来自u64。
// Somewhere at inception
let bbox = Box::new(MyStruct::from_u32(1u32).unwrap());
let rwptr = Box::into_raw(bbox);
let bignum_ptr = rwptr as u64;
// Later in life
let rehyrdrate: Box<MyStruct> = unsafe {
Box::from_raw(bignum_ptr as *mut MyStruct)
};
我想做的是根据需要一次又一次地're-Box'bignum_ptr。这可能吗?
【问题讨论】:
-
rehydrate超出范围时会发生什么?分配给盒子的内存是否应该被释放? -
bignum_ptr的持有者将负责丢弃, -
在这种情况下,
rehydrate应该是参考,而不是框:let rehyrdrate: &MyStruct = unsafe { &*(bignum_ptr as *const MyStruct) };。当您需要释放该框(并且知道不存在未完成的引用)时,您可以使用drop(Box::from_raw(bignum_ptr as *mut MyStruct))。 -
@user4815162342 谢谢...我会试试看!
-
很少有任何理由将原始指针转换为整数,但如果必须(某些 FFI 要求),您应该使用
usize而不是u64。
标签: rust