尽管不支持,但传递给是否有效?Box::from_raw
指向新分配的内存的原始指针
不,它无效。
特别是,Rust 会在出现以下情况时释放该内存吗?Box
被摧毁了吗?
是的,这就是它无效的原因。
内存分配器提供paired分配和释放例程。当你用一个分配器分配一块内存时,你必须用该分配器释放它.
如果不这样做,当执行释放的分配器去执行它需要执行的任何簿记操作时,它不会知道那块内存。实际进行分配的分配器永远不会将该内存标记为不可用。
这些担忧也不是虚构的。我有向 GLib 提交补丁纠正发生不匹配分配/释放并导致实际问题的地方。
Rust 取得分配的内存的所有权
在原始指针层面,所有权很大程度上是一种心态,就像在 C 或 C++ 中一样。到own这里的某些内容意味着您有责任适当地清理它。
malloc
and free
是成对的分配/释放方法。您可以创建自己的类型并实现Drop
for it:
use libc::{free, malloc};
use std::{ffi::c_void, mem};
struct MallocBox(*mut i32);
impl MallocBox {
fn new(v: i32) -> Self {
unsafe {
let p = malloc(mem::size_of::<i32>()) as *mut i32;
*p = v;
Self(p)
}
}
}
impl Drop for MallocBox {
fn drop(&mut self) {
unsafe { free(self.0 as *mut c_void) }
}
}
fn main() {
MallocBox::new(42);
}
真正的实施还将实施Deref
可能还有许多其他特征,因此这种类型的使用符合人体工程学。
必须创建一个会很烦人MallocBox
and JeMallocBox
and a MyCustomAllocBox
, 这就是为什么RFC 1398提出了分配器的共享特征。有关的工作正在进行中转换Box<T>
into Box<T, A: Alloc + Default = Global>
.
怎样才能强制 Rust
不存在“强迫”Rust 做任何事情的概念,更不用说涉及像这样的低级细节了。例如,无法保证分配指针的 C 代码不会尝试释放指针本身。在 FFI 世界中,所有权是一项合作协议。
也可以看看:
- 如何处理可以拥有或借用的 FFI 未定型类型?
- 包装拥有或借用数据的 FFI 结构体的更好方法是什么?