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

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 析构函数何时被调用?相关的知识,希望对你有一定的参考价值。

参考文章1:C++ 什么时候调用析构函数

参考文章2:析构函数何时被调用

文章目录

析构函数何时会被调用?

析构函数是在对象消亡时,自动被调用,用来释放对象占用的空间。

有四种方式会调用析构函数:

  • 1.生命周期:对象生命周期结束,会调用析构函数。

  • 2.delete:调用delete,会删除指针类对象。

  • 3.包含关系:对象Dog是对象Person的成员,Person的析构函数被调用时,对象Dog的析构函数也被调用。

  • 4.继承关系:当Person是Student的父类,调用Student的析构函数,会调用Person的析构函数。

第一种 生命周期结束(在栈区创建的对象,生命周期结束时,会自动执行析构函数)

#include <iostream>
using namespace std;
class Person
public:
    Person()
        cout << "Person的构造函数" << endl;
    
    ~Person()    
        cout << "删除Person对象 " << endl;
    
private:
    int name;
;

int main() 
    Person person;
    return 0;

编译运行结果:

Person的构造函数
删除Person对象

测试发现,在person生命周期结束时(main函数即将执行return),会自动调用自身的析构函数

第二种 delete(用new创建的对象,函数返回时,不会自动执行析构函数,需要手动delete才能执行析构函数)(此处要注意,如果不主动delete容易造成内存泄露)

对于new的对象,是指针,其分配空间是在堆上,故而需要用户删除申请空间,否则就是在程序结束时执行析构函数

#include <iostream>
using namespace std;

class Person 
public:
    Person() 
        cout << "Person的构造函数" << endl;
    
    ~Person() 
        cout << "删除Person对象 " << endl;
    
;

int main() 
    Person* person = new Person();
    delete person;
    return 0;

编译运行结果:

Person的构造函数
删除Person对象

第三种 包含关系(当对象1中的private里有对象2时,当对象1析构后,对象2会自动析构)

#include <iostream>
using namespace std;
class Dog 
public:
    Dog() 
        cout << "Dog的构造函数" << endl;
    
    ~Dog() 
        cout << "删除Dog对象 " << endl;
    
;
class Person 
public:
    Person() 
        cout << "Person的构造函数" << endl;
    
    ~Person() 
        cout << "删除Person对象 " << endl;
    
private:
    Dog dog;
;


int main() 
    Person person;
    return 0;

运行结果:

Dog的构造函数
Person的构造函数
删除Person对象
删除Dog对象

第四种 继承关系(栈区子对象生命周期结束时,会先执行自身析构函数,再执行父对象的析构函数)

#include <iostream>
using namespace std;

class Person 
public:
    Person() 
        cout << "Person的构造函数" << endl;
    
    ~Person() 
        cout << "删除Person对象 " << endl;
    
private:
;

class Student :public Person 
public:
    Student() 
        cout << "Student的构造函数" << endl;
    
    ~Student() 
        cout << "删除Student对象 " << endl;
    
private:
    string no;
;

int main() 
    Student student;
    return 0;

编译运行结果:

Person的构造函数
Student的构造函数
删除Student对象
删除Person对象

后续再补充。。。

以上是关于C++ 析构函数何时被调用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥C++里面,析构函数会被调用两次

c++ delete 调用析构函数问题。

C++ 类设计总结回顾------析构函数

究竟何时是析构函数或终止于调用的线程

C++ 类的继承三(继承中的构造与析构)

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