据我所知,编译器会自动生成代码,在范围结束时调用析构函数删除不再需要的对象.
在某些情况下,在不再需要某个对象时立即将其删除,而不是等待它超出范围,这是有益的.可以显式调用析构函数吗?
据我所知,编译器会自动生成代码,在范围结束时调用析构函数删除不再需要的对象.
在某些情况下,在不再需要某个对象时立即将其删除,而不是等待它超出范围,这是有益的.可以显式调用析构函数吗?
在Rust中,是否可以在范围结束之前删除对象?
对
可以显式调用析构函数吗?
不
为了澄清,可以使用std::mem::drop
来转移变量的所有权,这会导致变量超出范围:
struct Noisy;
impl Drop for Noisy {
fn drop(&mut self) {
println!("Dropping Noisy!");
}
}
fn main() {
let a = Noisy;
let b = Noisy;
println!("1");
drop(b);
println!("2");
}
1
Dropping Noisy!
2
Dropping Noisy!
但是,禁止您自己调用析构函数(Drop
trait的实现).这样做会导致双重空闲情况,因为编译器仍然会插入对Drop
trait的自动调用.
有趣的旁注——drop
的实现非常优雅:
pub fn drop<T>(_x: T) { }