Rust提供了获取原始指针所有权的能力,我们使用
slice::from_raw_parts_mut
和Box::from_raw
来告诉Rust将内存指针视为堆分配的数组。在转移所有权后,假设内存有效且大小/类型正确,Rust会应用其通常的内存安全性和包容性检查。上述内容所指的他代码的相关部分是:
let mut new_data = unsafe {
let ptr = Heap::default()
.alloc(Layout::array::<isize>(new_capacity).unwrap())
.unwrap() as *mut isize;
Box::from_raw(slice::from_raw_parts_mut(ptr, new_capacity))
};
然而,
Box::from_raw
的文档说明(重点强调):
为了避免疑问,上述使用(已在 Rust 1.27.0 中删除的)实验性由于 Box 分配和释放内存的方式是未指定的,此函数的唯一有效指针 是通过
Box::into_raw
函数从另一个 Box 中获取的指针。
Heap
API 执行内存分配,直接在其 alloc
方法中调用了 __rust_alloc
,因此 ptr
并非通过 Box::into_raw
获得。
即使不被支持,将指向新分配的内存的原始指针传递给Box::from_raw
以使Rust接管该内存并执行其通常的安全性和包含性检查是否有效?特别是当产生的Box被销毁时,Rust会释放那块内存吗?
如果不能,那么如何强制Rust接管通过其安全方法之外分配的内存所有权?
Box::from_raw
来处理非Box
所提供的指针,即使在某些情况下这可能是正确的,它也可能很快出错。另外,我怀疑一个良好的 C API 是否会关心资源释放,除了一些情况,你可以调用free
。我认为最好调用free
而不是猜测是否需要使用 box。 - Stargateur