简介
该文件包含了数值转换、内存管理、随机数生成、系统交互以及搜索与排序等功能
exit()
用于正常终止程序
当你调用它时,程序并不会立即消失,而是会执行一系列清理工作
当发现由于用户输入错误或缺少文件而无法继续,但程序逻辑依然在控制范围内时,可以使用 exit()
EG:
if(file == NULL) { cout < "文件找不到"; exit(1); }#include <iostream> #include <cstdlib> #include <string> using namespace std; class Demo { public: string name; Demo(string n) : name(n) { cout << "构造:" << name << "\n"; } ~Demo() { cout << "析构:" << name << "\n"; } }; Demo globalobj("全局对象"); int main() { Demo localobj("局部对象"); cout << "准备调用 exit(0)...\n"; exit(0); return 0;//注意有了 exit(0) 这行代码,程序就不会执行到 return 0; 这行代码了 }abort()
用于立即、异常地终止程序
它通常在程序遇到无法挽救的错误(如断言失败或严重的内存错误)时使用
当发现程序内部状态已经损坏,继续运行可能会导致更严重后果(如损坏数据库)时可以使用 abort()
EG:
在 assert() 宏失败时,底层通常调用的就是 abort()
#include <iostream> #include <cstdlib> using namespace std; class Demo { public: Demo() { cout << "构造 Demo\n"; } ~Demo() { cout << "析构 Demo\n"; } }; Demo globalobj; int main() { Demo localobj; cout << "遇到无法挽回的问题,准备调用 abort()...\n"; abort(); return 0;//注意有了 abort() 这行代码,程序就不会执行到 return 0; 这行代码了 }注意:
无论是 exit() 还是 abort(),都不会调用局部变量的析构函数(栈解旋)
如果你希望确保局部变量被正确清理,最好的做法通常是抛出一个异常(throw),或者使用 return 语句返回 main 函数
补充:
return:在 C++ 中,为了保证所有对象的析构函数都能正常运行(释放内存、关闭文件、解锁互斥量),应尽可能通过return退出main函数
如果你在深层函数中发现错误,应抛出异常 (throw)
如果异常未被捕获,C++ 默认会调用terminate(),而其默认行为就是abort()
C++11 引入了 quick_exit() ,它比exit()更快,因为它不销毁任何对象(无论全局还是局部),但依然会刷新某些流。