exit函数和析构函数的关系

exit( )函数的作用是删除所有的静态对象,刷新缓冲,关闭所有的I/O通道,然后结束程序。

  1. 如果对象是局部对象,exit()函数不会调用对象的析构函数,因为不存在栈空间回收问题。
  2. 如果对象是全局变量,会调用对象的析构函数
  3. 如果是动态建立的对象,除非手动删除,否则不会调用对象的析构函数

Q: 如果在C++里调用了exit() , 内存中的对象没调用析构函数就退出程序了,会不会导致内存泄漏?

A: 查阅资料,其实是不会的。

原因:

  1. 进程退出时,操作系统会回收该进程所占用的所有资源。所以不需要担心内存泄漏。
  2. exit()函数的也并不是完全不调用析构函数。参考ISO C++ 2003标准,static对象是会被析构的,auto对象不会析构。

示例程序:

#include <string>
#include <iostream>
#include <stdlib.h>class AObj
{public:AObj(){std::cout << "------------------------AObj::AObj..." << std::endl;}AObj(const std::string &str){str_ = str;std::cout << "------------------------AObj::AObj..." << str_ << std::endl;}~AObj(){std::cout << "-----------------------[AObj::~AObj]..." << str_ << std::endl;}private:std::string str_;
};static AObj s_obj("static");
AObj g_obj("global");static AObj* s_obj_p = new AObj("new static ptr");
AObj *g_obj_p = new AObj("new global ptr");int main()
{static AObj s_obj_2("main static");AObj obj("stack local");static AObj *s_obj_2_p = new AObj("main static ptr");AObj* obj_ptr = new AObj("stack local ptr");exit(0);
}// 编译输出
➜  test_home g++ test_exit.cc
➜  test_home ./a.out
------------------------AObj::AObj...static
------------------------AObj::AObj...global
------------------------AObj::AObj...new static ptr
------------------------AObj::AObj...new global ptr
------------------------AObj::AObj...main static
------------------------AObj::AObj...stack local
------------------------AObj::AObj...main static ptr
------------------------AObj::AObj...stack local ptr
-----------------------[AObj::~AObj]...main static
-----------------------[AObj::~AObj]...global
-----------------------[AObj::~AObj]...static

Reference:

  1. https://www.zhihu.com/question/20765487/answer/24430299

exit函数和析构函数的关系相关推荐

  1. exit函数_全面深入了解 Python 魔法函数

    (点击上方公众号,可快速关注一起学Python) 作者:浪子燕青       链接: http://www.langzi.fun/Python魔法函数.html 魔法函数概念 魔法函数是以双下划线开头 ...

  2. C++ 笔记(34)— C++ exit 函数

    当遇到 main 函数中的 return 语句时,C++ 程序将停止执行.但其他函数结束时,程序并不会停止.程序的控制将返回到函数调用之后的位置.然而,有时候会出现一些非常少见的情况,使得程序有必要在 ...

  3. objective-c abort() 与 exit() 函数的区别

    exit()函数 调用exit会让用户感觉程序崩溃了,不会有按Home键返回时的平滑过渡和动画效果:另外,使用exit可能会丢失数据,因为调用exit并不会调用-applicationWillTerm ...

  4. C语言main函数、return、exit函数

    main函数 说到return,有必要提及主函数的定义.很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的. C/C++ 中从来没有定义过void main( ) ...

  5. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  6. 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

    构造函数不可以是虚函数:析构函数可以是虚函数,也可以是纯虚函数. 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的. 而在构造 ...

  7. 多线程编程:return、pthread_exit()、exit()函数区别

    多线程编程:return.pthread_exit().exit()函数区别: return:                 返回到调用者那里去 pthread_exit():    将调用该函数的 ...

  8. exit函数的头文件问题

    c标准对头文件的解释: 标准头文件要有3点特征: 1)幂等性:多次包含和只包含一次没差别 2)相互独立性:标准头文件之间不可互相包含//说明楼上cpazstido是错的 3)文件级别:头文件要在全局作 ...

  9. strlen()函数 与 “\0“ 的关系 与 利用;strcmp()

    众所周知 strlen()函数是用来计算长度的; strlen()函数 与 "\0" 的关系 strlen() 在读取字符串的时候 会 一直读到 \0 处停止; 例如以下代码; 结 ...

最新文章

  1. [Mongodb]删除指定字段
  2. mysql.cnf utf8_mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项
  3. Windows Live SkyDrive, Windows Live Sync 和 Live Mesh
  4. 出租广告Java代码_Spring cloud 查询返回广告创意实例代码
  5. 天津大学计算机专硕_「20考研」计算机考研专业课变动汇总
  6. 11个实用的Apache .htaccess配置
  7. Q121:PBRT-V3,光传播方程(The Light Transport Equation)(14.4章节)
  8. 小程序map地图多点定位
  9. Linux-----信号量
  10. spark处理大数据实例
  11. 【技巧总结】理解XXE从基础到盲打
  12. openssl的部分使用例子
  13. win 10 查看mysql密码_win10下mysql重设密码教程
  14. 视频号|常见违规限流情况及解除方法
  15. Cut through switching
  16. POJ3608-旋转卡壳
  17. 爱软测学员面试外企测试工程师英文面试小结
  18. sol文件解析AS2.0——小游戏上古神器2存档通过Python解析
  19. 【2】非线性方程求解函数vpasolve
  20. 手动推导计算AES中的s盒的输出

热门文章

  1. HTMLCSS实战项目------极简博客开发
  2. 计算机的数学知识的手抄报图片大全,数学手抄报怎么做图片大全
  3. 1688接口 -电商代购
  4. 我该选择留下,还是离开?
  5. 世界上最权威的管理名言
  6. 江西省计算机学业水平考试试题,江西省高中信息技术学业水平考试(样题)
  7. Linux which命令
  8. ubuntu修改网卡名
  9. IDEA中实现在单元测试方法中用控制台输入数据
  10. monkeyrunner2