return是返回的最常用的方式
_exit属于POSIX定义的系统调用
exit是GLIBC封装之后的函数
1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装exit函数的时候加了一些功能:比如提供了在结束程序时回调的接口(atexit), flush 缓冲区(系统调用是没法做这个的
,因为像printf, scanf之类的缓冲区都属于应用层缓冲区,内核清理资源自然无法顾及)
2return 会清理函数栈,另外两个就不会了,如果是最后一个线程return,也会像exit那样清理资源并flush缓冲区,这一点可以通过一段代码观察一下:
1 #include<iostream> 2 #include<unistd.h> 3 using namespace std; 4 5 class A 6 { 7 public: 8 A(){ 9 cout << "constructor" << endl; 10 } 11 ~A(){ 12 cout << "distructor" << endl; 13 } 14 }; 15 void func(int i) 16 { 17 A a; 18 if(i == 0) 19 _exit(-1); 20 else 21 return; 22 } 23 24 int main() 25 { 26 func(1); 27 return 0; 28 }
这里可以发现,只有按照return 方式返回局部变量a的析构函数才能得到调用,因为exit _exit都是不清理函数栈的.
一般这不会有什么问题,因为资源都回收了,栈空间自然也没了.但是对于约定在函数返回时调用的函数就没法调用了.
时间: 2024-10-12 20:28:08