【Leecode刷题】详解析构函数出现的必要性

95 阅读3分钟

【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.

不妥之处请多多指教!