C++ 析构函数何时被调用?
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 析构函数何时被调用?相关的知识,希望对你有一定的参考价值。
文章目录
析构函数何时会被调用?
析构函数是在对象消亡时,自动被调用,用来释放对象占用的空间。
有四种方式会调用析构函数:
-
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++ 析构函数何时被调用?的主要内容,如果未能解决你的问题,请参考以下文章