关于析构函数的问题
如果我们定义了一个析构函数,系统就不会再定义了吗?如果是这样的话,要是我们定义析构函数时里面不写任何语句,系统是怎么销毁对象的呢?是不是系统里本来就有这个操作,只要我们写出“~类名”这个语句,就会自动执行?
如果我们定义了一个析构函数,系统就不会再定义了吗?如果是这样的话,要是我们定义析构函数时里面不写任何语句,系统是怎么销毁对象的呢?是不是系统里本来就有这个操作,只要我们写出“~类名”这个语句,就会自动执行?
2019-07-16
我用以下实验来解决一下这个问题,好久之前的欸,。
一、我不加入析构函数让系统自动生成默认的,看一下效果
1.class.h中:
不自定义~Teacher(),并设一个指针p;
2.class.cpp中:
构造函数申请一片空间,并给空间赋值10;
3.main.c中:
我定义一个函数test,返回值为指针,函数中申请一个对象,将对象的指针p作为返回值。这里我解释一下,我们都知道有局部变量,并且前面有讲到栈空间,局部变量就存在栈空间中,会随着函数返回而释放,即对象被销毁了。于是会调用系统自动生成的析构函数。
前面也学到new申请的是堆空间,它不会随着函数返回而消失,如果没有delete的话。我用主函数定义一个指针来指向这个new申请的空间,防止它走失。这时候,就可以查看main函数中指针p所指空间是否为10,就可以来判断这片空间是否被销毁了。
运行结果如下:
显然,依旧存在数据。所以可以得到,系统默认的析构函数他不会delete,也不会p=NULL。
当然,我还是要继续进行下面的实验,如果我们自定义析构函数加入delete和NULL,运行结果是怎么样的?是不是空间被销毁导致主函数获得的返回空间是乱码:
二、我加入自定义析构函数,手动delete,看一下效果
1.class.h与class.cpp
2.运行结果
可以看到,函数结束后调用了一次~Teacher(),并且主函数的p指针最终指向的数据是一堆我们看不懂的乱码,也就是说,空间内数据或者空间其实已被销毁了。
总结:
综上所述,如你所说的,如果自己定义一个析构函数里面什么都不写,确实销毁的时候什么都不执行。
而且系统默认生成的析构函数也不会销毁掉new申请的堆空间,大工程如果大量申请堆空间而没有销毁,会占用很大的内存资源。
我觉得这个方法或许是用来匹配自己其他方法中new申请的空间或者其他,统一于对象销毁时执行delete或者其他删除操作,延长申请的这块空间的生命周期,从对象创建到对象销毁整个过程中,都能使用这块空间。
希望对你有帮助。大力感谢制作视频的老师,太厉害了!
举报