exit与return的区别

来源:互联网 发布:巴西衰落知乎 编辑:程序博客网 时间:2024/04/29 06:55

exit比return更加“暴力”,因为它将绕过临时变量、局部变量的析构方法。这意味着,对于那种需要清理堆内存的对象来说,这将引起内存泄漏。虽然程序运行后关闭,泄漏的内存会被OS收回,不过析构方法中有些善后操作或许是必需的,绕过它会带来一些麻烦,比如保存一些数据到文件。

注意,exit绕过的仅仅是临时变量、局部变量的析构方法,全部变量、静态变量的析构方法仍然会被调用的。下面是一个例子:

// by btwsmileclass CSomething{public:// destructor~CSomething(){printf("Destructor called.\n");}};int main(int argc, _TCHAR* argv[]){static CSomething s_st;CSomething st;exit(100);//return 100;}

静态变量s_st的析构方法将被调用,但局部变量st的析构方法将被绕过,因此运行结果只有一条“Destructor called.”输出到屏幕。

如果换为return,s_st和st的析构方法都将被调用,因此运行结果将有两条“Destructor called.”输出到屏幕。

有的朋友可能已经注意到exit和return后的code了,之所以我使用比较大的数值100,是为了说明exit code的作用。需要澄清的是,return 100仍然会调用exit(100)的,只不过是由CRTstartup函数调用的而已。

exit code表示程序的返回状态,在命令解释器中,可通过查看%ERRORLEVEL%获得它。上面的示例程序编译链接后得到call_exit.exe,在命令解释器中运行它,然后查看%ERRORLEVEL%值,结果如图所示:

exit test result

 

结论:

exit将绕过非全局区对象的析构方法,这可能引起某些问题。除非你很清楚自己想做什么,建议尽量使用温和的return,而非exit。

原创粉丝点击