基于微软C++文档:调用exit()时哪些变量会被销毁?
关于exit()、return与程序终止时对象处理的疑问解答
问题1:调用exit()时自动变量s不会被销毁,是理解有误还是文档错误?
微软文档的描述完全符合C++标准,是你之前的理解存在偏差。
在C++标准中,exit()的行为明确规定:
- 会触发全局、静态存储期对象的析构函数,以及执行
atexit()注册的终止处理函数; - 但不会销毁当前栈帧中的自动变量(即示例里的局部非静态对象
s)。
而return是从main()函数返回,会先清理当前函数栈内的所有自动变量(调用它们的析构函数),再进入程序终止的后续流程(全局对象析构等),最终向操作系统返回状态码。
问题2:自动变量未被销毁时栈内存如何回收?堆上对象会泄漏吗?
- 栈内存回收:程序终止时,操作系统会直接回收整个进程占用的全部内存空间,包括栈内存。所以哪怕
exit()没有调用自动变量s的析构函数,操作系统也会把s所在的栈内存彻底回收,不会留下内存残留。 - 堆内存泄漏:如果
s是通过new分配在堆上的(比如S* s = new S{3};),调用exit()时不会自动执行delete,也不会触发堆对象的析构函数。这会造成内存泄漏——操作系统虽然会回收堆内存空间,但对象析构函数里的资源释放逻辑(比如关闭文件、释放句柄等)不会被执行,这类资源会被泄漏。
补充:abort()的终止行为更直接,它既不会销毁自动变量,也不会处理全局/静态对象的析构,直接终止程序,操作系统同样会回收所有内存,但所有对象的析构逻辑都不会触发。
内容的提问来源于stack exchange,提问作者heretoinfinity
相关产品推荐
相关产品推荐

