据我所知,编译器会自动生成代码,在范围结束时调用析构函数删除不再需要的对象.

在某些情况下,在不再需要某个对象时立即将其删除,而不是等待它超出范围,这是有益的.可以显式调用析构函数吗?

推荐答案

在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) { }

Rust相关问答推荐

如何使用Match比较 struct 中的值

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

如何使用 list 在Rust for Windows中编译?

使用Clap时如何将String作为Into Str参数传递?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

如何go 除铁 rust 中路径组件的第一项和最后一项?

支持TLS的模拟HTTP服务器

有没有办法指定只在Rust的测试中有效的断言?

如何在函数中返回自定义字符串引用?

获取与父字符串相关的&;str的原始片段

为什么RefCell没有与常规引用相同的作用域?

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

为相同特征的特征对象使用 move 方法实现特征

Rust 中的静态引用

信号量释放后 Rust 输出挂起线程

为什么我的trait 对象类型不匹配?

将 Futures 的生命周期特征绑定到 fn 参数

如何将参数传递给Rust 的线程?

为什么这个值在上次使用后没有下降?

在 Rust 中组合特征的不同方法是否等效?