C++函数退栈时的对象销毁顺序
来源:互联网 发布:奢侈品折扣店知乎 编辑:程序博客网 时间:2024/06/05 20:03
众所周知,在函数返回时,函数内部声明的局部变量会被销毁,但是,这个销毁的顺序是怎样的呢?今天特地写了一个小程序把这个问题搞明白了。
答案是:销毁时会按照从后向前的顺序销毁,也就是说,越在后面定义的对象会越早销毁。对于引用和指针,不会立即销毁,而是在真正定义他们的对象的时候再销毁;而作为函数参数传入的对象会在最后销毁。其中的原因就是函数是在栈中保存的,因此,先定义的对象先压栈,所以在退栈时就会后销毁。而如果参数有多个的话,大多数编译器是从右开始压栈的,也就是参数列表最右边的变量最先压栈,所以参数列表最右边的变量会在最后销毁。
看代码:
#include <iostream>using namespace std;class A{public: virtual ~A(){ cout<<"A"<<endl; }};class B{public: virtual ~B(){ cout<<"B"<<endl; }};class C{public: virtual ~C(){ cout<<"C"<<endl; }};class D{public: virtual ~D(){ cout<<"D"<<endl; }};void f(C c,D d);int main(){ C c; D d; f(c,d); return 0;}void f(C c,D d){ B b; A a; B* pb=&b;}
程序的输出是:
A
B
C
D
D
C
我们看到A在B之前输入,也就是说,在f()函数返回时,先跳过了指针pb,然后销毁a,然后销毁b(也就是pb所指向的内容);而c在d之前,印证了d先进栈,所以d最后销毁。最后,在main退出时,同样按照后进先出的原则,先销毁对象d,再销毁c。
注意:如果函数参数是引用类型,则不会对参数进行销毁。
0 0
- C++函数退栈时的对象销毁顺序
- C++对象产生和销毁的顺序
- Cocos2d-x初始化对象和销毁对象函数执行顺序
- 22-对象的销毁-析构函数
- 对象初始化顺序与销毁顺序
- 创建和销毁过程几个函数的执行顺序
- 创建和销毁过程几个函数的执行顺序
- MFC应用程序中窗口创建 销毁调用函数的顺序
- 创建和销毁过程几个函数的执行顺序
- 创建和销毁过程几个函数的执行顺序
- 创建和销毁过程几个函数的执行顺序
- MFC创建和销毁窗口时函数的调用顺序
- 对象的销毁原则
- 对象的销毁
- Java对象的销毁
- 对象的销毁
- QObject 的构建/销毁顺序
- Java中包含继承关系时对象的创建与销毁顺序详解(附源码)
- Linux常用命令大全
- vs开发插件
- php curl_init()
- C++内存地址分配和内存区划分简介
- 发现好东西 开发android的轻量级框架Afinal
- C++函数退栈时的对象销毁顺序
- 如何让Gridview在没有数据的时候显示表头(asp.net)
- Tomcat
- entity framwork code first 迁移的官方例子
- 使用OpenCv库的MFC程序在退出后报内存泄露Detected memory leaks! 可能解决方法
- android:drawableLeft的Button不能切换图片问题之解决办法
- 计算机相关经典书籍推荐
- 如何找回误删的照片?
- 笔试题集锦