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/