析构函数 订阅
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。 展开全文
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
信息
外文名
destructor
命    名
与类名相同,在前面加位取反符~
应用学科
计算机科学
相    反
构造函数
中文名
析构函数
目    的
清理善后” 的工作
析构函数函数介绍
与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。 [1] 
收起全文
精华内容
下载资源
问答
  • 析构函数
    千次阅读
    2021-01-17 17:48:57

    析构函数也是一个在类中跟构造函数类似的特殊功能的成员函数,作用与构造函数相反,是在对象的声明周期结束的时候会被自动调用.在C++中析构函数的名字跟类名相同,并在前面带上一个取反的符号~,表达的意思也跟构造函数的过程相反.

    默认情况下,如果类没有定义自己的析构函数,编译器会自动为该类生成一个默认的析构函数,只不过函数体是空的,也就是什么都没做.所有,如果需要在对象被删除的时候做一些操作的话,就得自己定义析构函数.


    以下几种情况会自动调用析构函数:
    ①如果一个函数中定义了一个局部变量的对象,那么当这个函数执行结束时也就是该变量对象生命周期结束的时候,所以析构函数会被自动调用.
    ②全局变量或者static类型的变量,他们的生命周期一般是在程序退出的时候,该对象的析构函数才会被调用.
    ③如果是用new操作符动态的创建了一个对象,只有当用delete进行释放该对象的时候,析构函数才会被调用.


    析构函数的作用:
    那构造函数来说,构造函数是新建对象吗?不是,而是在对象被创建出来后自动被调用的,用来初始化相关信息的函数.同理:析构函数也不是用来删除对象的,而是当对象被删除的时候自动被调用的,用来做一些对象被删除之前的清理工作,只有对象的生命周期结束,那么程序就自动执行析构函数来完成这个工作.


    析构函数的特点:
    析构函数不返回任何值,没有函数类型,也没有任何函数的参数.析构函数不能被重载,所以,一个类中可以有多个构造函数,但只有一个析构函数.


    析构函数使用示例:

    CStudent::~CStudnet()
    {
    	cout<<"~CStudent() callec."<<endl;
    }
    

    //本文来源于VC驿站,仅作为个人学习记录

    更多相关内容
  • C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类...
  • 在C++中,不能声明虚构造函数,但可以声明虚析构函数。多态性是指不同的对象对同一消息有不同的行为特性。虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有...
  • 析构函数的作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1、析构函数名是在类名前加以符号“~”。 2、析构函数没有参数、返回类型和修饰符。 3、一个类中至多有一个析构函数,如果程序员...
  •  析构函数的工作方式是:底层的派生类(most derived class)的析构函数先被调用,然后调用每一个基类的析构函数。  因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,...
  • 析构函数用于析构类的实例。 备注 不能在结构中定义析构函数。只能对类使用析构函数。 一个类只能有一个析构函数。 无法继承或重载析构函数。 无法调用析构函数。它们是被自动调用的。 析构函数既没有修饰符,也没有...
  • 由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者的分析情况一样(对于默认的构造函数分析,请参看《从汇编看c++中默认构造函数的使用...
  • 详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数  编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为: class String { public: String(const char *str = NULL); // 普通...
  • 主要介绍了详解C++中如何将构造函数或析构函数的访问权限定为private的方法,文中还解释了构造函数与虚函数的区别,需要的朋友可以参考下
  • 简单的说,析构函数是用来在对象关闭时完成的特殊工作,比如我写的上例,在实例化同时打开某文件,但是它什么时候关闭呢,用完就关闭呗,所以析构函数直接关闭它, 又或者在析构时,我们将处理好的某些数据一并写进数据库,...
  • C++ 析构函数与变量的生存周期实例详解 这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 析构函数(destructor)的名字...
  • 详解C++中的析构函数

    2020-12-17 04:29:04
    析构函数(Destructors),是对象的成员函数,没有返回值也没有参数,且一个类只有一个析构函数,当对象被销毁的时候调用,被销毁通常有这么几个情况。 函数执行结束 程序执行结束 程序块包含的局部变量 delete...
  • 某工厂使用一种圆柱形的铁桶来运输色拉油,但是关于该油桶的容量已经模糊,现在工人们测得了油桶直径和高(由键盘输入),请帮工人们计算...4、析构函数,该函数暂时不做额外处理工作,但需要输出“析构函数被调用”
  • 在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。 简单来说,其构造函数...
  • 析构函数 当某个对象成为垃圾或者当对象被显式销毁时执行。 PHP5中提供的析构函数是__destruct,其与构造方法__construct相对应。 垃圾回收——GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,这个...
  • 构造函数与析构函数

    2016-02-16 14:46:56
    每个类都具有构造函数和析构函数。其中,构造函数在定义对象时被调用,析构函数在...析构函数没有返回值,甚至void类型也不可以,析构函数也没有参数,因此析构函数是不能够重载的。这是析构函数与普通函数最大的区别。
  • 即C++ 的全局对象构造函数在main 函数之前执行,而C++ 全局对象的析构函数在main函数之后被执行。  Linux系统中,一般程序的入口是“ _start , 这个函数是Linux系统库(Glibc)的一部分。当我们的程序与Glibc库链接...
  • C++中基类的析构函数为什么要用virtual虚析构函数.pdf
  • 推迟运行昂贵的析构函数,直到稍后进行drop-bin。在Rust中,值的析构函数超出范围时将自动运行。 但是,析构函数可能会很昂贵,因此您可能希望将它们的运行推迟到以后,当程序有一些空闲时间或内存使用率很高时。 ...
  • 本篇文章是对C++中虚析构函数的作用进行了详细的分析介绍,需要的朋友参考下
  • 与构造函数相反,在PHP5中,可以定义一个名为__destruct()的函数,称之为PHP5析构函数,PHP将在对象在内存中被销毁前调用析构函数,使对象在彻底消失之前完成一些工作。对象在销毁一般可以通过赋值为null实现。
  • 本文给大家分享了避免析构函数调用虚函数。
  • C++虚析构函数和纯虚析构函数

    千次阅读 2020-07-05 10:31:05
    1、为什么要使用虚析构函数 我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏。 那怎么还有虚析构函数呢? 使用虚析构函数的类一般是要...

    1、为什么要使用虚析构函数

    我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏。

    那怎么还有虚析构函数呢?

    使用虚析构函数的类一般是要作为基类,被其他类继承。通过把基类的析构函数声明为虚函数,就可以通过父类指针来释放子类对象,从而完成子类的一些清理工作,防止出现内存泄漏。

    案例1:基类析构函数为非虚函数

    //test.h
    class Parent
    {
    public:
            Parent();
            ~Parent();
    private:
            int *p_ptr;
    };
    
    class Child : public Parent
    {
    public:
            Child();
            ~Child();
    private:
            int *c_ptr;
    };
    
    //test.cpp
    #include "test.h"
    #include <iostream>
    
    using namespace std;
    
    Parent::Parent()
    {
            p_ptr=new int;
            *p_ptr=10;
    }
    
    Parent::~Parent()
    {
            cout << "Parent::~Parent() was called." << endl;
            if(p_ptr != 0)
            {
                    delete p_ptr;
                    p_ptr=0;
            }
    }
    
    Child::Child()
    {
            c_ptr=new int;
            *c_ptr=20;
    }
    
    //main.cpp
    #include "test.h"
    
    void func(Parent *parent)
    {
            delete parent;//通过父类指针来释放子类对象
    }
    
    int main(int argc, char *argv[])
    {
            Child *child=new Child;
    
            func(child);
            return 1;
    }
    

    运行结果:

    Parent::~Parent() was called.
    结论:父类析构函数为非虚函数时,通过父类指针来释放子类对象时,只会调用父类的析构函数,而不会调用子类的析构函数,造成了子类的内存泄漏。所以,应该将父类的析构函数声明为虚函数。

    案例2:父类的析构函数为虚函数

    其他文件不用动,只需修改test.h,将父类的析构函数声明为虚函数。

    //test.h
    class Parent
    {
    public:
            Parent();
            virtual ~Parent();//虚析构函数
    private:
            int *p_ptr;
    };
    
    class Child : public Parent
    {
    public:
            Child();
            ~Child();
    private:
            int *c_ptr;
    };
    
    

    运行结果:

    Child::~Child() was called.
    Parent::~Parent() was called.
    结论:只有将父类的析构函数声明为虚析构函数时,通过父类指针释放子类对象时,会先调用子类的析构函数,然后调用父类的析构函数,不存在内存泄漏问题。

    2、纯虚析构函数

    通过上面的虚析构函数知道,C++基类的析构函数最好声明为虚机构函数,那什么时候声明为纯虚析构函数呢?

    我们知道,带有纯虚函数的类为抽象类,不能被实例化,只能被子类继承,所以当我们设计一个基类为抽象类时,可以把析构函数声明为纯虚析构函数,这样基类就是抽象类了。

    注意:纯虚析构函数也要有函数体,用来做一些基类的清理工作,防止基类出现内存泄漏。

    展开全文
  • 主要介绍了C++编程中派生类的析构函数,析构函数平时一般使用较少,需要的朋友可以参考下
  • 详细解释了为什么析构函数可以是虚函数,而构造函数不能是虚函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,148
精华内容 84,059
关键字:

析构函数

友情链接: Contribute.zip