exit函数和析构函数的关系
exit函数和析构函数的关系
exit( )函数的作用是删除所有的静态对象,刷新缓冲,关闭所有的I/O通道,然后结束程序。
- 如果对象是局部对象,exit()函数不会调用对象的析构函数,因为不存在栈空间回收问题。
- 如果对象是全局变量,会调用对象的析构函数
- 如果是动态建立的对象,除非手动删除,否则不会调用对象的析构函数
Q: 如果在C++里调用了exit() , 内存中的对象没调用析构函数就退出程序了,会不会导致内存泄漏?
A: 查阅资料,其实是不会的。
原因:
- 进程退出时,操作系统会回收该进程所占用的所有资源。所以不需要担心内存泄漏。
- 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:
- https://www.zhihu.com/question/20765487/answer/24430299
exit函数和析构函数的关系相关推荐
- exit函数_全面深入了解 Python 魔法函数
(点击上方公众号,可快速关注一起学Python) 作者:浪子燕青 链接: http://www.langzi.fun/Python魔法函数.html 魔法函数概念 魔法函数是以双下划线开头 ...
- C++ 笔记(34)— C++ exit 函数
当遇到 main 函数中的 return 语句时,C++ 程序将停止执行.但其他函数结束时,程序并不会停止.程序的控制将返回到函数调用之后的位置.然而,有时候会出现一些非常少见的情况,使得程序有必要在 ...
- objective-c abort() 与 exit() 函数的区别
exit()函数 调用exit会让用户感觉程序崩溃了,不会有按Home键返回时的平滑过渡和动画效果:另外,使用exit可能会丢失数据,因为调用exit并不会调用-applicationWillTerm ...
- C语言main函数、return、exit函数
main函数 说到return,有必要提及主函数的定义.很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的. C/C++ 中从来没有定义过void main( ) ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。
构造函数不可以是虚函数:析构函数可以是虚函数,也可以是纯虚函数. 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的. 而在构造 ...
- 多线程编程:return、pthread_exit()、exit()函数区别
多线程编程:return.pthread_exit().exit()函数区别: return: 返回到调用者那里去 pthread_exit(): 将调用该函数的 ...
- exit函数的头文件问题
c标准对头文件的解释: 标准头文件要有3点特征: 1)幂等性:多次包含和只包含一次没差别 2)相互独立性:标准头文件之间不可互相包含//说明楼上cpazstido是错的 3)文件级别:头文件要在全局作 ...
- strlen()函数 与 “\0“ 的关系 与 利用;strcmp()
众所周知 strlen()函数是用来计算长度的; strlen()函数 与 "\0" 的关系 strlen() 在读取字符串的时候 会 一直读到 \0 处停止; 例如以下代码; 结 ...
最新文章
- [Mongodb]删除指定字段
- mysql.cnf utf8_mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项
- Windows Live SkyDrive, Windows Live Sync 和 Live Mesh
- 出租广告Java代码_Spring cloud 查询返回广告创意实例代码
- 天津大学计算机专硕_「20考研」计算机考研专业课变动汇总
- 11个实用的Apache .htaccess配置
- Q121:PBRT-V3,光传播方程(The Light Transport Equation)(14.4章节)
- 小程序map地图多点定位
- Linux-----信号量
- spark处理大数据实例
- 【技巧总结】理解XXE从基础到盲打
- openssl的部分使用例子
- win 10 查看mysql密码_win10下mysql重设密码教程
- 视频号|常见违规限流情况及解除方法
- Cut through switching
- POJ3608-旋转卡壳
- 爱软测学员面试外企测试工程师英文面试小结
- sol文件解析AS2.0——小游戏上古神器2存档通过Python解析
- 【2】非线性方程求解函数vpasolve
- 手动推导计算AES中的s盒的输出