C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。
而默认的析构函数不是虚函数的原因是因为:虚函数需要额外的 虚函数表和 虚表指针,会占用格外内存,对于不会有子类的类来说,这个是没有必要的。
一句话来说:防止子类内存泄漏 如果基类的析构函数不是虚函数的话,可能造成子类析构函数没有调用,从而导致内存泄漏。 什么情况下会出现子类内存泄漏呢?如下 Base *b = (Base *)new Child; delete b; 1. 2. 基类没有析构函数就啥事也没有~ 当然如果你不显式声明析构函数,或者说自己没有实现析构函数时,就...
考虑以下情景,当我们使用基类的指针管理派生类,使用delete释放该指针时,会调用基类的析构函数~Base(),如果基类的析构函数是虚函数,那么就会继续调用派生类的析构函数~Derived();而如果基类的析构函数不是虚函数,就只会调用基类的析构函数,那么派生类中的那片内存就不会被释放,从而造成内存泄漏。 Base*base_ptr=...
第一种,析构没有写成虚函数,看看会怎样: 执行结果,在delete p的时候,只调用了A的析构函数。没有调用B的析构函数。 下面修改成虚函数,就正常了。