析构,析构函数为什么是虚函数

伏羲号

析构,析构函数为什么是虚函数?

这样会先调用a类的析构函数,再调用b类的析构函数删除掉a类中的virtual 修饰这样只会调用a类的析构函数上面是现象,题主显然问的是原因?

当使用delete pa指向基类的引用时,释放pa所指的内存,而pa所指的是b对象,为什么不会调用b的析构函数呢?这里由于是静态联编,b在编译时已经确定所指向的函数时b的函数,而不会根据对象a来确定指向的函数。如此一来如果b申请的内存资源,但是没有在它的析构函数中释放资源,造成内存泄露。

析构,析构函数为什么是虚函数

细想一下,出现虚函数的原因不也是这个吗?

增加了virtual机制,在进行编译的时候,看到virtual就会自动将方法指向b的地址,于是我们就可以通过设置机制找到b的析构函数。

为了改变这个,就出现了虚析构函数

只要将基类的析构函数设为virtual型,则所有派生类都自动将析构函数设为virtual型,这样子就保证了不会因为析构函数未被调用而导致内存泄露。

中list用clear函数清空后?

1、会析构 ,使用clear函数后,会清空所有保存的变量,同样会调用该变量的析构函数进行清理。2、vector,clear()并不真正释放内存(这是为优化效率所做的事),clear实际所做的是为vector中所保存的所有对象调用析构函数(如果有的话),然后初始化size这些东西,让觉得把所有的对象清除了。真正释放内存是在vector的析构函数里进行的,所以一旦超出vector的作用域(如函数返回),首先它所保存的所有对象会被析构,然后会调用allocator中的deallocate函数回收对象本身的内存。 所以,某些编译器clear后还能访问到对象数据(因为它根本没清除),在一些比较新的C++编译器上(例如VS2008),当进行数组引用时(例如a[2]这种用法),STL库中会有一些check函数根据当前容器的size值来判断下标引用是否超出范围,如果超出,则会执行这样一句: _THROW(out_of_range, "invalid vector<T> subscript"); 即抛出一个越界异常,clear后没有捕获异常,程序在新编译器编译后就会崩溃掉。

析构函数与构造函数有什么区别?

析构函数和构造函数的主要区别是它们执行的时间不同。构造函数在对象创建时执行,用于初始化对象成员变量;而析构函数在对象销毁时执行,用于清理对象所占用的资源。析构函数和构造函数都是类的成员函数,在实现类时必须包括它们。析构函数在对象销毁时自动被调用,它与构造函数的主要区别在于执行时间。由于C++采用了动态内存分配技术,因此析构函数非常重要,它能释放对象所分配的动态内存空间,从而避免内存泄漏的问题。此外,析构函数也可以用于做一些清理工作,比如关闭文件、断开网络连接等。当然,析构函数也可以根据需要重载,从而实现特定的功能。

析构函数在什么时候被调用?

析构函数是在对象生命周期结束时被调用,也就是在对象被销毁时调用。当对象被销毁时,编译器会自动调用析构函数来进行对象的清理工作,这包括释放对象所占用的内存、销毁对象中的成员对象以及调用其它必要的清理操作。

析构函数同样也可以手动调用,例如在手动释放对象所占用的内存时,可以显式调用析构函数来进行清理工作。总之,析构函数是面向对象编程中重要的一部分,它提供了对象的清理工作和资源管理的机制。

析构函数在什么时候才会被调用?

析构函数(destructor)与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后”的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

析构函数在类创建出来的对象的生命周期结束的时候将会被调用。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,80人围观)

还没有评论,来说两句吧...