You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于微软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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:25:56