在 2018 年 2 月题为“ Rust 中的内存安全:C 案例研究”的笔记中,Will Crichton 写道:
拉斯特提供吃生的三分球,这是我们使用的所有权的能力
slice::from_raw_parts_mut和Box::from_raw它告诉防锈处理内存指针作为堆中分配的数组。转让所有权后,假设内存有效且大小/类型正确,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))
};
Run Code Online (Sandbox Code Playgroud)
但是,Box::from_raw状态文档(已添加强调):
由于 Box 分配和释放内存的方式未指定,因此传递给此函数的唯一有效指针是通过该函数从另一个 Box 获取的指针
Box::into_raw。
为避免疑义,(实验)Heap上面使用API来执行存储器分配(因为在锈病1.27.0移除)直接调用__rust_alloc在其alloc方法和因此ptr是不从得Box::into_raw。
将Box::from_raw原始指针传递给新分配的内存以让 Rust 获得该内存的所有权并执行其通常的安全和包含检查是否有效,尽管不受支持?特别是,当出现的 Box 被销毁时,Rust 会释放该内存吗?
如果没有,怎么能一个强制锈病采取的记忆这种所有权不是通过其安全的方法分配其他?