为了账号安全,请及时绑定邮箱和手机立即绑定

关于析构函数的问题

如果我们定义了一个析构函数,系统就不会再定义了吗?如果是这样的话,要是我们定义析构函数时里面不写任何语句,系统是怎么销毁对象的呢?是不是系统里本来就有这个操作,只要我们写出“~类名”这个语句,就会自动执行?

正在回答

2 回答

我用以下实验来解决一下这个问题,好久之前的欸,。

一、我不加入析构函数让系统自动生成默认的,看一下效果

1.class.h中:

http://img1.sycdn.imooc.com//5e561d120001d0fe08140332.jpg

不自定义~Teacher(),并设一个指针p;


2.class.cpp中:

http://img1.sycdn.imooc.com//5e561b6f00018f1207540149.jpg

构造函数申请一片空间,并给空间赋值10;


3.main.c中:

http://img1.sycdn.imooc.com//5e561b800001a0ea03420319.jpg

我定义一个函数test,返回值为指针,函数中申请一个对象,将对象的指针p作为返回值。这里我解释一下,我们都知道有局部变量,并且前面有讲到栈空间,局部变量就存在栈空间中,会随着函数返回而释放,即对象被销毁了。于是会调用系统自动生成的析构函数。

前面也学到new申请的是堆空间,它不会随着函数返回而消失,如果没有delete的话。我用主函数定义一个指针来指向这个new申请的空间,防止它走失。这时候,就可以查看main函数中指针p所指空间是否为10,就可以来判断这片空间是否被销毁了。

运行结果如下:

http://img1.sycdn.imooc.com//5e561b8a00012a9403000059.jpg

显然,依旧存在数据。所以可以得到,系统默认的析构函数他不会delete,也不会p=NULL。

当然,我还是要继续进行下面的实验,如果我们自定义析构函数加入delete和NULL,运行结果是怎么样的?是不是空间被销毁导致主函数获得的返回空间是乱码:

二、我加入自定义析构函数,手动delete,看一下效果

1.class.h与class.cpp

http://img1.sycdn.imooc.com//5e561c44000181ee05220073.jpg

http://img1.sycdn.imooc.com//5e561c500001b84104350129.jpg

2.运行结果

http://img1.sycdn.imooc.com//5e561c5c00015dfe02680071.jpg

可以看到,函数结束后调用了一次~Teacher(),并且主函数的p指针最终指向的数据是一堆我们看不懂的乱码,也就是说,空间内数据或者空间其实已被销毁了。


总结:

        综上所述,如你所说的,如果自己定义一个析构函数里面什么都不写,确实销毁的时候什么都不执行。

        而且系统默认生成的析构函数也不会销毁掉new申请的堆空间,大工程如果大量申请堆空间而没有销毁,会占用很大的内存资源。

        我觉得这个方法或许是用来匹配自己其他方法中new申请的空间或者其他,统一于对象销毁时执行delete或者其他删除操作,延长申请的这块空间的生命周期,从对象创建到对象销毁整个过程中,都能使用这块空间。

    

希望对你有帮助。大力感谢制作视频的老师,太厉害了!






0 回复 有任何疑惑可以回复我~

析构函数在对象销毁时调用,要销毁对象需要自己写销毁代码,系统不会自动销毁对象,个人理解

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(上)
  • 参与学习       103411    人
  • 解答问题       701    个

封装--面向对象的基石,本教程力求帮助小伙伴们即学即会

进入课程

关于析构函数的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信