< 返回博客

snlan 发表于 2019-01-08 10:07

Tags:drop

struct CustomSmartPointer { data: String, }

impl Drop for CustomSmartPointer { fn drop(&mut self) { println!("Dropping CustomSmartPointer with data {}!", self.data); } }

谁便实现了Drop(只是打印), 如果是在堆上分配内存,离开作用域后真的会清理内存吗

评论区

写评论
yim7 2019-01-21 17:21

在调用 CustomSmartPointer 的 drop 之后,会递归调用其成员的 drop,你可能觉得只会调用自己实现的 drop

Pslydhh 2019-01-09 22:19

会.

堆内存: 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"); }

可以看到离开作用域时都回收了内存同时打印了数据。

chirsz 2019-01-09 13:06

这和C++的析构函数差不多的,比如如果你之前用std::alloc::alloc分配了堆内存,就要在drop时手动调用std::alloc::dealloc释放内存;不过一般使用Box、Rc等智能指针自动管理内存的分配和释放。 drop还可以用在文件的自动关闭,数据库自动断开连接等地方,这种设计叫RAII,可以自行搜索学习。

1 共 3 条评论, 1 页