C++深入讲解对象的销毁之析构函数
目录
一、对象的销毁二、析构函数三、小结一、对象的销毁
生活中的对象都是被初始化后才上市的生活中的对象被销毁前会做一些清理工作—股而言,需要销毁的对象都应该做清理解决方案
为每个类都提供一个 public 的 free 函数对象不再需要时立即调用 free 函数进行清理如下:
存在的问题
free 只是一个普通的函数,必须显示的调用对象销毁前没有做清理,很可能造成资源泄漏C++ 编译器是否能够自动调用某个特殊的函数进行对象的清理?
二、析构函数
C++ 的类中可以定义一个特殊的清理函数
这个特殊的清理函数叫做析构函数析构函数的功能与构造函数相反定义:~ClassName()
析构函数没有参数也没有返回值类型声明析构函数在对象销毁时自动被调用下面开始简单使用析构函数:
#includeclass Test { public: Test() { printf("Test()\n"); } ~Test() { printf("~Test()\n"); } }; int main() { Test t; return 0; }
输出结果如下:
t 虽然是对象,但是本质上也是局部变量,在 return 0 之前会销毁,t 被销毁时析构函数会被自动调用。
下面再来看一个例子:
#includeclass Test { int mi; public: Test(int i) { mi = i; printf("Test(): %d\n", mi); } ~Test() { printf("~Test(): %d\n", mi); } }; int main() { Test t(1); Test* pt = new Test(2); delete pt; return 0; }
输出结果如下:
析构函数的定义准则
当类中自定义了构造函数,并且构造函数中使用了系统资源(如∶内存申请,文件打开,等) ,则需要自定义析构函数。
下面再来看一个实验:
IntArray.h:
#ifndef _INTARRAY_H_ #define _INTARRAY_H_ class IntArray { private: int m_length; int* m_pointer; public: IntArray(int len); IntArray(const IntArray& obj); int length(); bool get(int index, int& value); bool set(int index ,int value); ~IntArray(); }; #endif
IntArray.cpp:
#include "IntArray.h" #include "stdio.h" IntArray::IntArray(int len) { m_pointer = new int[len]; for(int i=0; imain.cpp:
#include#include "IntArray.h" int main() { IntArray a(5); for(int i=0; i 输出结果如下:
可以看到 do it 输出两次,也就是说析构函数被自动调用两次。
三、小结
析构函数是对象销毁时进行清理的特殊函数析构函数在对象销毁时自动被调用析构函数是对象释放系统资源的保障到此这篇关于C++深入讲解对象的销毁与析构函数的文章就介绍到这了,更多相关C++ 对象的销毁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:C++ 详细讲解对象的构造顺序
下一篇:C语言详细讲解二分查找用法
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?