C++类对象在各种内存区的构造函数析构函数执行顺序
2016-12-22 16:41
274 查看
首先一个前提是,析构函数的执行顺序和构造函数的执行顺序是恰好相反的,即使如果构造函数的顺序是 A,B,C ,那这三个类的析构函数的执行顺序就是C,B,A
看代码:
执行结果:
为什么会这样呢?
因为
1.C++程序中,全局对象是在主函数main执行之前就被初始化的,所以C类对象第一个被创建
2.执行到main函数的时候,因为A先被new出来,所以A类对象第二个被创建,同理,B,D也被创建
3.那析构的时候,因为先调用了 delete pa,所以A类对象先被删除,执行析构函数
4.接着就执行到了return 0,意味着函数结束了,当函数结束的时候,由于B对象是局部变量,因此他会随着函数的结束都释放,因此B对象第二个执行析构函数。
5.由于静态变量和全局变量都创建在静态存储区,静态存储区是在程序结束才释放,所以C,D是最后调用析构函数的,而为什么是D先执行,因为构造函数是C先执行的。
析构函数的执行顺序与构造函数相反,所以先D,再C
看代码:
#include <iostream> using namespace std; class C { public: C(){ cout<<"create C"<<endl; } ~C(){ cout<<"destroy C"<<endl; } }; class B { public: B(){ cout<<"create B"<<endl; } ~B(){ cout<<"destroy B"<<endl; } }; class D { public: D(){ cout<<"create D"<<endl; } ~D(){ cout<<"destroy D"<<endl; } }; class A { public: A(){ cout<<"create A"<<endl; } ~A(){ cout<<"destroy A"<<endl; } }; C c; int main() { A *pa = new A(); B b; static D d; delete pa; return 0 ; }
执行结果:
为什么会这样呢?
因为
1.C++程序中,全局对象是在主函数main执行之前就被初始化的,所以C类对象第一个被创建
2.执行到main函数的时候,因为A先被new出来,所以A类对象第二个被创建,同理,B,D也被创建
3.那析构的时候,因为先调用了 delete pa,所以A类对象先被删除,执行析构函数
4.接着就执行到了return 0,意味着函数结束了,当函数结束的时候,由于B对象是局部变量,因此他会随着函数的结束都释放,因此B对象第二个执行析构函数。
5.由于静态变量和全局变量都创建在静态存储区,静态存储区是在程序结束才释放,所以C,D是最后调用析构函数的,而为什么是D先执行,因为构造函数是C先执行的。
析构函数的执行顺序与构造函数相反,所以先D,再C
相关文章推荐
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- c++ 内存申请释放,构造函数,析构函数,执行顺序
- 浅出C++对象模型——理解构造函数、析构函数执行顺序
- c++中,类 和 类中成员(对象)的构造函数和析构函数的执行顺序
- 宋体、构造函数-浅出C++对象模型——理解构造函数、析构函数执行顺序-by小雨
- 浅谈C++对象模型——理解构造函数、析构函数执行顺序
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- C++面向对象复习(三)——构造函数与析构函数的调用顺序
- C++派生类--基类构造函数,内嵌对象(子对象)的执行顺序
- 构造函数和析构函数的执行顺序
- C++-理解构造函数、析构函数执行顺序
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 类继承中构造函数、析构函数的执行顺序
- C++中构造函数和析构函数(virtual)的执行顺序
- C++类成员构造函数和析构函数顺序示例详细讲解
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 派生类构造函数和析构函数的执行顺序
- C++派生类--基类构造函数,内嵌对象(子对象)的执行顺序
- 再学Java 基础(3)类与对象【构造函数以及其执行顺序----经典讲解】重点!!!