C++函数退栈时的对象销毁顺序

众所周知,在函数返回时,函数内部声明的局部变量会被销毁,但是,这个销毁的顺序是怎样的呢?今天特地写了一个小程序把这个问题搞明白了。

答案是:销毁时会按照从后向前的顺序销毁,也就是说,越在后面定义的对象会越早销毁。对于引用和指针,不会立即销毁,而是在真正定义他们的对象的时候再销毁;而作为函数参数传入的对象会在最后销毁。其中的原因就是函数是在栈中保存的,因此,先定义的对象先压栈,所以在退栈时就会后销毁。而如果参数有多个的话,大多数编译器是从右开始压栈的,也就是参数列表最右边的变量最先压栈,所以参数列表最右边的变量会在最后销毁。

看代码:

#include 


using namespace std;


class A{
public:
    virtual ~A(){
        cout<<"A"<

程序的输出是:

A

B

C

D

D

C

我们看到A在B之前输入,也就是说,在f()函数返回时,先跳过了指针pb,然后销毁a,然后销毁b(也就是pb所指向的内容);而c在d之前,印证了d先进栈,所以d最后销毁。最后,在main退出时,同样按照后进先出的原则,先销毁对象d,再销毁c。

注意:如果函数参数是引用类型,则不会对参数进行销毁。

你可能感兴趣的:(C++)