析构函数
2016-04-13 11:11
218 查看
当一个对象的生命周期结束后,其所占的内存就要被回收;
回收资源的工作就由析构函数来完成,析构函数就是反向的构造函数:
注意:
析构函数没有返回值;
析构函数没有参数;
一个类中只有一个析构函数 ;
析构函数的执行顺序与构造函数执行的顺序相反;
如果在构造函数里自己在堆区申请了内存空间,那么在析构函数里就需要自己手动来完成释放!
来看实例:
为什么c++里用new
和delete而不用malloc和free呢???//new
和delete调用构造和析构函数;而malloc和free只是申请和释放空间;
Cpeople*ppp=(Cpeople*)malloc(sizeof(Cpeople));
free(ppp);
所以在C++里类中对象的创建,必须用new和delete!!
回收资源的工作就由析构函数来完成,析构函数就是反向的构造函数:
注意:
析构函数没有返回值;
析构函数没有参数;
一个类中只有一个析构函数 ;
析构函数的执行顺序与构造函数执行的顺序相反;
如果在构造函数里自己在堆区申请了内存空间,那么在析构函数里就需要自己手动来完成释放!
来看实例:
#include <iostream> using namespace std; class Cpeople { public: char *m_name; public: Cpeople()//构造函数; { m_name=new char[10]; //自己再堆区申请的空间,一定要手动去释放; strcpy_s(m_name,10,"kongyin"); cout<<"cpeople()"<<endl; } ~Cpeople()//析构函数;回收类申请的堆空间new的内存; { delete []m_name; //手动释放; m_name=NULL; cout<<"~CPeople()"<<endl; } }; int main() { char *p=NULL; { Cpeople pp;//【实例对象】声明周期就是大括号; p=pp.m_name; cout<<pp.m_name<<endl; Cpeople *pop=new Cpeople;//【指针对象】的声明周期就是遇到delete; cout<<pop->m_name<<endl; delete pop;//现在指针对象调用析构函数; //new调用构造,delete调用析构; } //cout<<p<<endl;//析构完了就不存在了; system("pause"); return 0; }
为什么c++里用new
和delete而不用malloc和free呢???//new
和delete调用构造和析构函数;而malloc和free只是申请和释放空间;
Cpeople*ppp=(Cpeople*)malloc(sizeof(Cpeople));
free(ppp);
所以在C++里类中对象的创建,必须用new和delete!!
相关文章推荐
- Oracle之BBED之(二)-----BBED更改数据块
- 轻松把玩HttpClient之封装HttpClient工具类(二),插件式配置HttpClient对象
- FFT模板
- 172.The SQL statements executed in a user session are as follows:
- 字符集和编码
- Hbase 伪分布安装及Hbase shell操作
- 没有显示器且IP未知的情况下登录树莓派
- unity3d插件Daikon Forge GUI 中文教程3-基础控件Button和Sprite的使用
- HTML5 Input 类型
- 推荐eclipse插件Properties Editor
- MySQL中数据类型的验证
- bzoj3231 [Sdoi2008]递归数列
- 去掉点击a链接带来的虚框
- Socket心跳包机制
- WEB
- 两种并发模型 的理解(个人理解)
- 服务器端判断request来自Ajax请求(异步)还是传统请求(同步)
- HDOJ(HDU) 1406 完数
- iOS 真机测试提示框处理
- 玩转android zxing二维码扫描,完整资源