struct CustomSmartPointer { data: String, }
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data {}
!", self.data);
}
}
谁便实现了Drop(只是打印), 如果是在堆上分配内存,离开作用域后真的会清理内存吗
1
共 3 条评论, 1 页
评论区
写评论在调用 CustomSmartPointer 的 drop 之后,会递归调用其成员的 drop,你可能觉得只会调用自己实现的 drop
会.
堆内存: fn main() { let _k = Box::new(CustomSmartPointer{ data: "SSSSSS".to_string() }); // drop(_k); println!("over"); }
非堆内存: fn main() { let _k = CustomSmartPointer{ data: "SSSSSS".to_string() }; // drop(_k); println!("over"); }
可以看到离开作用域时都回收了内存同时打印了数据。
这和C++的析构函数差不多的,比如如果你之前用std::alloc::alloc分配了堆内存,就要在drop时手动调用std::alloc::dealloc释放内存;不过一般使用Box、Rc等智能指针自动管理内存的分配和释放。 drop还可以用在文件的自动关闭,数据库自动断开连接等地方,这种设计叫RAII,可以自行搜索学习。