- 定义包含
Box<T>
的自定义结构体
struct Container {
data: Box<[i32]>,
}
- 结构体实例转移所有权时的内存情况
fn take_container(container: Container) {
// `container` 在此处获得新的所有者,原所有者不再拥有该实例
// 这里并没有释放内存,只是转移了所有权
}
fn main() {
let c1 = Container { data: Box::new([1, 2, 3]) };
take_container(c1);
// 这里如果尝试使用 `c1` 会编译错误,因为所有权已转移
}
- 结构体生命周期结束时的内存释放
fn main() {
{
let c2 = Container { data: Box::new([4, 5, 6]) };
// `c2` 在此块结束时,其析构函数被自动调用
}
// `c2` 已超出作用域,`Box<[i32]>` 所占用的堆内存被释放
}
- Rust内存管理策略说明
- 所有权系统:Rust通过所有权系统来管理内存。每个值都有一个唯一的所有者,当所有者离开作用域,Rust会自动调用该值的析构函数。
Box<T>
与堆内存:Box<T>
用于在堆上分配内存,当包含Box<T>
的结构体实例的所有权转移时,Box<T>
内部指向的堆内存的所有权也一同转移,而不是复制数据。当结构体实例生命周期结束,其析构函数被调用,会释放Box<T>
指向的堆内存,确保内存安全且高效。例如上述Container
结构体中的Box<[i32]>
,在Container
实例离开作用域时,Box<[i32]>
占用的堆内存会被正确释放,不会出现内存泄漏等问题。