rust - 什么时候 `std::process::exit` O.K.使用?

标签 rust destructor exit

documentation of std::process::exit说:

If a clean shutdown is needed it is recommended to only call this function at a known point where there are no more destructors left to run.

可能由于我缺乏系统编程背景,我不知道是否有析构函数在特定点运行,我是否应该关心。我唯一想到的是挂起对文件(或其他文件)的写入操作,最好让文件保持干净状态。

还有什么需要注意的吗?我怀疑在更大、更复杂的程序中使用它是不可取的,但对于小型工具来说似乎很方便。

最佳答案

简答:

  • 宁可使用 panic!() 在几乎所有情况下
  • 您几乎只能确保没有析构函数要运行,如果...
    • ...你在main()功能
    • ...您手动处理堆栈,包括展开(您可能不是...)
  • 有时您可以在退出程序时忽略析构函数,但您需要小心!

稍微长一点的解释

[...] for small tools it seems convenient.

如果由于不可恢复的错误而想退出程序,推荐的方法是 panic!() .这将展开堆栈(运行所有析构函数)并使用附加信息(包括您可以指定的消息字符串)退出程序。

[...] if there are destructors left to run at a specific point and if I should care.

如果有实现 Drop 的局部变量,还有 析构函数要运行在您当前的堆栈框架或上面的任何堆栈框架中。堆栈帧是堆栈内存中的一个区域,用于保存函数调用的所有局部变量(松散地说)。函数退出后,丢弃所有局部变量,包括调用所有实现 Drop 的变量的析构函数.

某些析构函数需要运行的可能性随着堆栈的深度而增加(“在 main() 和您当前的堆栈帧之间调用了多少函数)。因此,当您不在main() 函数。


类型何时实现 Drop ?当只是忽略它们是错误的。考虑一个 i32 :当我们退出函数时,我们可以将它留在堆栈内存中,因为它没有任何负面影响(暂时忽略数据安全的特殊情况)。但是,有很多类型确实需要实现 Drop .这里有几个类别:

  • 分配堆内存:Box<T> , Vec<T> , HashMap<T> , ...
  • 持有操作系统资源:File , Socket , ...
  • 返回句柄:Ref , MutexGuard , ...
  • ...

不为那些运行析构函数有不同的效果。第一组可能是最无害的:我们会泄漏内存。但是当你退出你的程序时,操作系统无论如何都会清理所有这些内存。操作系统资源几乎也是如此:文件描述符通常在程序退出时被操作系统删除。

但是运行析构函数还有更多原因。需要考虑的重要一点:您通常不知道为什么某些类型实现 Drop ,但这些类型确实依赖于它。当您忽略它时,某些不想要的事情可能发生。通常您不会真正注意到,但有时它会导致严重的问题。

关于rust - 什么时候 `std::process::exit` O.K.使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39228685/

相关文章:

java - 我们什么时候应该在 Java 中调用 System.exit

emacs - 当尝试使用 company-rust 时,即使提供了正确的路径,公司也找不到赛车手

c++ - 运算符 new/delete 和析构函数

java - 关闭我的程序后如何保存对象变量?

c++ - 如何将 std::unique_ptr<Parent> 与具有 protected 虚拟析构函数的只读父类一起使用

c++ - std::queue 析构函数慢得要死,bug?

linux - 退出在 SSH 脚本的内部函数中不起作用

rust - `T : ' static`是什么意思?

rust - 如何表达容器的 Rust 迭代器的生命周期

rust - 这个 C 结构的 Rust 等价物是什么?