c++ 析构函数 是在啥时候执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 析构函数 是在啥时候执行相关的知识,希望对你有一定的参考价值。

main 函数

析构函数是不是在main函数最后一条之前执行 就是return 0;之前的时候执行

c++ 析构函数调用时间:

1、对象生命周期结束,被销毁时;

2、delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;

3、对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。

C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

扩展资料:

C++语言特点:

1、支持继承和重用

在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。

2、支持多态性

采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。

继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。

参考资料来源:百度百科-C++

参考技术A

析构函数有2种方式调用,一个是主动调用delete,另一个是根据RAII的规则,在对象的生命周期结束时自动析构。第一点没什么好说的,就简单讲下第二点。

对象的生命周期不等于是程序的生命周期,一般我们所谓的生命周期就是一个作用域,当变量或者对象离开这个作用域时就会自动析构。一般一对就是一个作用域,举个例子

int main()

for(int i=0;i<10;i++)
    A a;

a//错误,脱离作用域

for结束后,就无法使用a了,因为该对象的生命周期已结束。

一般在函数里的对象,离开函数时才算离开作用域,即return发生时,才执行析构,所以main中定义的对象不是在你说的return 0;之前执行的。return是一个离开的标志,只有遇到了该标志,才会开始离开。

全局对象的话,是在程序结束时才执行析构,即遇到main中的return时,任何程序都是从main开始,到main结束的。

如果是new的对象,即使离开了作用域也会一直存在,必须主动delete,否则只有在结束程序时才会执行析构。这里在说下内存泄漏,举个例子

void fun()
    A *a = new A();

int main()
    while(1)
        fun();
    
    reutn0;

当离开fun时,虽然离开了作用域,但用new动态开辟空间的对象是不会析构的,你可以观察任务管理器,看到内存一直在上升。但你在其他地方缺无法使用a所开辟的空间,因为a这个指针是保存在栈上的,当离开作用域后就自动析构(或者说自动消失了),但它所在分配空间是分配在堆上的,只有主动析构或程序结束,才会释放空间,也就是丢失了这块空间的地址,无法操作这块空间了

参考技术B 你好,析构函数在类对象被销毁时执行(也就是当对象的生命期结束时),譬如在一个代码块中声明一个非静态类对象,当代码块结束时,类对象的生命期也就结束,这时类对象就调用它的析构函数。
类对象的析构函数大多用于释放类对象所包含的堆内存,因为堆内存不同于栈,是不会被自动销毁的。
参考技术C 给你个连接兄弟,希望能够帮助到你http://see.xidian.edu.cn/cpp/biancheng/view/196.html追问

析构函数是与构造函数作用相反的函数。当对象的生命期结束时,会自动执行析构函数。

本回答被提问者采纳
参考技术D   C++中,除了new来的空间存放在堆内,其他均存放在栈中。
  当单纯的创建对象的时候,对象存放在栈中,此时在程序块的后面,系统会自动调用析构函数,释放掉栈空间。
  但是,如果创建了指向new来的一块空间的指针的时候,如果在没有显示释放掉new到的堆空间时,系统是不会自动调用析构函数去释放栈空间中的指针的。

C++之类和对象的使用

  析构函数

析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一系列清理工作,使这部分内存可以被程序分配给新对象使用。对象生命周期结束,程序就自动执行析构函数来完成这些工作。

析构函数是一种特殊的成员函数,它的作用与构造函数相反,它的名字前面加一个“~”符号,在C++中,“~”是取反运算符,这点可以看出析构函数和构造函数的作用是相反的。

当对象的生命结束时,会自动执行构造函数。具体有以下四种情况:

1)如果在一个函数中定义了一个对象(假设是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数

2)静态(static)局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。

3)如果定义了一个全局的对象,则在程序的流程离开其作用域时,调用该全局的对象的析构函数。

4)如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。

析构函数不返回任何值,没有函数类型,也没有函数参数。由于没有函数参数,因此不能被重载,这点区别于构造函数。一个类可以有多个构造函数,但只能有一个析构函数;

除上述作用之外,它可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。例如输入有关信息。。。

//#inculde<string>  //Dev C++条件下编译
#include<iostream>
using namespace std;
class Student
{
    public:
        Student(int n,string nam, char s)
        {
            num=n;
            name=nam;
            sex=s;
            cout<<"Consrructor called. "<<endl;        
        }
        ~Student()
        {
            cout<<"Destructor called. "<<num<<endl;        
        }
        void display()
        {
            cout<<"num: "<<num<<endl;
            cout<<"name: "<<name<<endl;
            cout<<"sex: "<<sex<<endl;
        }
        private:
            int num;
            string name;
            char sex;        
};
            int main()
            {
                Student stud1(10010,"Wang_li",\'f\');
                stud1.display();
                Student stud2(10011,"Zhang_dalei",\'m\');
                stud2.display();
                return 0;
            }  

注意:先执行stud2的析构函数,再执行stud1的析构函数。

   调用构造函数和析构函数的顺序

 

以上是关于c++ 析构函数 是在啥时候执行的主要内容,如果未能解决你的问题,请参考以下文章

C++虚析构函数

C++ 析构函数何时被调用?

C++ 析构函数何时被调用?

C++知识分享:为什么单例代码的析构函数有时候不执行呢?

c++析构函数需要异常处理吗?如需要实现有何要求?

C++之类和对象的使用