`
睡着的兔子
  • 浏览: 34946 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

析构函数 设置为虚函数

 
阅读更多

#include <iostream>
#include <stdlib.h>
using namespace std;

class A
{
      public :
      A()
      {
             cout<<"A"<<endl;
             ptr = new int[10];
      }
      ~A()
      {
      delete ptr;
      cout<<"delete A"<<endl;
      }
      private:
      int *ptr;
            
};
class B: public A
{
      public:
      B()
      {
             cout<<"B"<<endl;
             ptr = new long[10];
      }
      ~B()
      {
          delete ptr;
          cout<<"delete B"<<endl;
      }
    private:
     long *ptr;
     
};
int main()
{
    A *a=new B();
    delete a;
    system("pause");
    return 0;
}

效果截图:

可见B所申请的内存没有释放掉,所以这样很容易产生内存泄露,那么我们将A的析构函数设置为virtual,再看看


可见这个时候 释放掉了A,B的内存。

因为new出来的是B类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。 为了保险起见,对于每个类的析构函数设置为虚函数,但是会增加一定的内存

注:
1.析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。
2.多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。
析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
分享到:
评论

相关推荐

    C++中虚析构函数的作用

    只有当一个类被用来作为基类时,才需要将析构函数设置为虚函数。这是因为虚函数表会增加类的存储空间,所以我们需要根据实际情况进行判断。 虚析构函数在C++中起着非常重要的作用,它可以确保资源的正确释放,避免...

    C++中析构函数定义成虚函数的原因.doc

    1. **避免内存泄漏**:如前所述,如果不将基类的析构函数声明为虚函数,则通过基类指针删除派生类对象时,只会调用基类的析构函数,派生类的析构函数不会被调用。这可能导致派生类中的资源未被正确释放,引发内存...

    构造函数不能声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数主要是因为构造过程中对象的动态类型尚未确定,而析构函数可以声明为虚函数以确保正确释放资源并避免内存泄漏等问题。理解这些基本原则对于编写高质量、健壮的C++程序至关重要。

    虚析构函数示例

    在继承体系中,如果没有声明析构函数为虚的,那么通过基类指针或引用删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能会导致资源泄露和其他未定义行为。而声明了虚析构函数后,系统会...

    C++箴言:避免析构函数调用虚函数

    ### C++箴言:避免析构函数调用虚函数 #### 概述 在C++编程中,理解和遵循良好的设计模式对于确保程序的稳定性和可维护性至关重要。其中一个经常被提及的原则是“避免在析构函数中调用虚函数”。这一原则在C++语言...

    为何要虚析构函数.docx

    然而,析构函数可以是虚函数,而构造函数不能是虚函数,这是为什么呢?今天我们就来详细解释这个问题。 首先,让我们来看一下为什么析构函数需要是虚函数。如果析构函数不是虚的,那么将只调用对应于指针类型的析构...

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    虚函数、虚析构函数都是动态绑定的基础。 在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏。为什么?因为当我们使用基类指针指向派生类对象时,如果基类的析构函数不是 virtual 的,...

    虚基类 虚函数成员 虚析构函数

    在C++编程语言中,虚基类、虚函数成员和虚析构函数是面向对象编程中的关键概念,它们对于理解和实现多态性至关重要。多态性允许我们编写更灵活、可扩展的代码,使得程序能处理多种不同类型的对象。下面将详细解释这...

    C++析构函数使用virtual的原因

    如果这些类型还涉及多态,即作为其他类的基类,那么为了确保资源的正确释放,基类的析构函数应当声明为虚函数。 3. **一致性原则** 如果一个类提供了至少一个虚函数,意味着它可能用于多态性场景,此时其析构函数...

    C++ 析构函数 参考源代码

    virtual ~Base() { // 基类析构函数声明为虚函数 // ... } }; class Derived : public Base { public: ~Derived() override { // 派生类析构函数 // ... } }; ``` 总的来说,析构函数是C++中进行资源管理的...

    析构函数应用

    6. **可以是虚函数**:如果希望在派生类中覆盖基类的析构函数,则可以在基类中声明析构函数为虚函数。 #### 三、示例代码解析 下面通过给出的代码示例来详细了解析构函数的应用: ```cpp #include using ...

    深析C++析构函数

    5. **可以是虚函数:** 如果类中包含虚函数,则析构函数也应声明为虚函数,以确保派生类的析构函数也能被正确调用。 #### 二、析构函数与资源管理 **资源管理的重要性:** 资源管理是程序设计中极其重要的环节之一...

    派生的析构函数被调用

    在C++编程中,析构函数是一个特殊类型的成员函数,用于清理对象在创建时分配的资源。当对象的生命周期结束...在MFC环境中,这一点尤为重要,因为MFC类库中大量的类都依赖于正确的析构函数调用来维护系统资源的完整性。

    C++析构函数 快速学习

    不声明为虚析构函数可能导致只调用了基类的析构函数,而忽略了派生类的析构函数,这是一种常见的错误。 此外,析构函数可以重载,就像普通成员函数一样。但要注意,析构函数的重载并不意味着它们会自动被调用,你...

    详解C++中虚析构函数的作用及其原理分析

    虚析构函数的作用可以总结为以下两点: 1. 如果父类的析构函数不加virtual关键字,当父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。 2. 如果父类的析构函数加virtual...

    c++虚析构函数及虚函数的详细例子.rar

    在C++编程语言中,虚函数(Virtual Functions)和虚析构函数(Virtual Destructors)是面向对象编程中的重要概念,特别是在处理继承和多态性时显得尤为关键。本资料详细介绍了这两个主题,并通过实例进行了深入讲解...

    c++思维导图/很全,附带考点

    虚析构:将可能被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。如果基类的析构函数不是虚函数,在特定情况...

    析构函数的作用 什么是析构函数

    定义析构函数格式为: ~类名() {…}  由于c#得到自动内存管理的支持,当对象生命期结束后,系统能够自动回收那些对象应该释放的资源等,所以一般不需要程序员的关心,对于一般的对象,程序中不需要定义析构函数...

    C++虚析构函数、纯虚析构函数

    分类:  虚析构函数  析构函数的工作方式是:底层的派生类(most derived class)的析构函数先被调用,然后调用每一个基类的析构函数。...  但是,一般如果不做基类的类的析构函数一般不声明为

Global site tag (gtag.js) - Google Analytics