【Leecode刷题】详解析构函数出现的必要性
输入输出需要内存!
同学你好,你已经学了用scanf,cin指令进行输入输出 。但如果你想输入一篇英文文章是否也可以用这两种指令呢?答案是否定的,每台电脑都会有自己的随机处理器(RAM),下面是我的电脑参数:
我们可以发现我的电脑有16G的内存,但这16G只会有很小的一部分分给Dev-C++,打开任务管理器内存分配可见一斑,能够scanf和cin调用的仅约1M左右。
传统C语言应对策略
#include<stdlib.h> //调用malloc函数的头文件
s=(char*) malloc(128*sizeof(char));//用malloc函数申请动态内存
free(s);//释放空间
对代码的解释:
- 由于malloc函数返回值为void,为空类型指针,而s是字符型指针,直接赋值可能会报错。故在其前加上强制类型转换(char*)。
- 有时候我们不记得申请字符所占字节数,故这里使用sizeof();
- 128*代表申请128个char类型地址空间。
- 最后动态内存程序结束后并不会自己释放,造成内存泄漏,需要调用free()进行释放。
申请动态内存的好处
char m_szname1[25]; //申请长度为25的char数组
m_szname2=(char*) malloc(255);
char * m_szname2; //申请一个char类型的指针
free(m_szname2);
对代码的解释:
- 第一种方式申请char类型数组会限定其大小,此题m_szname1至多容纳25个字符。
- 第二种申请一个指针,指向一个字符串,则指针不会限定字符串的长度
- 由于指针必须指向地址,则需提前用malloc申请指针的动态内存。
- 程序不会自主释放动态内存,需要调用free进行释放。
有没有感觉malloc很厉害
析构函数闪亮登场
什么是析构函数:
1、析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间。
2、析构函数如果我们不写的话,C++ 会帮我们自动的合成一个,就是说:C++ 会自动的帮我们写一个析构函数。很多时候,自动生成的析构函数可以很好的工作,但是一些重要的事迹,就必须我们自己去写析构函数。
3、按照 C++ 的要求,只要有 new 就要有相应的 delete 。这个 new 是在构造函数里 new 的,就是出生的时候。所以在死掉的时候,就是调用析构函数时,我们必须对指针进行 delete 操作。
析构函数的好处:
他某种程度上类似free()函数,不过是对构造函数申请的动态内存的清理,但我们注意到free()函数的使用是需要人为判断人为调用的,这需要程序编写者自己判断什么时候不再需要申请的动态内存,要求较高。而析构函数会在构造函数结束后由编译器自行调用,释放动态内存,可见其优越性。
wuli康康的参考资料
你可以找到更多关于heap,malloc和free的信息,请点 here.
你可以找到更多关于new与delete创建对象的信息,请点 here.
不妥之处请多多指教!