面试题答案
一键面试Box 智能指针内存安全机制
- 内存分配:
- 当使用
Box::new(T)
创建一个Box<T>
时,Box<T>
会在堆上分配一块足够存储类型T
数据的内存空间。例如:
这里,let b = Box::new(5);
Box::new(5)
在堆上为i32
类型的5
分配内存,并返回一个指向该内存的Box<i32>
。 - 当使用
- 内存释放:
Box<T>
实现了Drop
特征。当Box<T>
离开其作用域时,会自动调用Drop
特征的drop
方法。在drop
方法中,会释放Box<T>
所指向的堆内存。例如:
{ let b = Box::new(5); } // 这里 b 离开作用域,自动调用 drop 方法释放堆内存
- 防止悬空指针:
- Rust 的所有权系统确保了在
Box<T>
所指向的内存被释放后,不会有任何其他指针指向该内存。因为Box<T>
只有一个所有者,当所有者离开作用域,内存被释放,不存在其他引用。例如:
let b1 = Box::new(5); let b2 = b1; // 所有权从 b1 转移到 b2,b1 不再有效 // 此时如果尝试使用 b1,编译器会报错,从而避免了悬空指针问题
- 不像 C++ 等语言,手动释放内存后可能忘记更新指针,导致悬空指针。在 Rust 中,所有权系统和
Box<T>
的自动内存管理机制使得这种情况不可能发生。
- Rust 的所有权系统确保了在
总之,Box<T>
通过在堆上分配内存、在离开作用域时自动释放内存以及依赖 Rust 所有权系统防止悬空指针,确保了内存安全。