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
原创粉丝点击