C++:使用方法调用析构函数的顺序是什么?

C++: What is the order of destructor call with methods?

我得到了这个代码:

编辑:完整代码:

#include <iostream>
using namespace std;

class A {
    public:
    A() {}
    A(const A& a) {
         cout << "A copy ctor" << endl;
    }
    virtual ~A() {
         cout << "A dtor" << endl; 

    }
    virtual void type() const { 
        cout << "This is A" << endl; 

    }
};

class B: public A {
    public:
    B(){}
    virtual ~B() {
         cout << "B dtor" << endl; 
    }
    void type() const override {
         cout << "This is B" << endl; 
    }
};

A f(A a) {
    a.type();
    return a;
}

const A& g(const A& a) {
    a.type();
    return a;
}

int main() {
    A* pa = new B();
    cout << "applying function f:" << endl;
    f(*pa).type();
    cout << "applying function g:" << endl;
    g(*pa).type();
    delete pa;
    return 0;
}

我在调试代码时注意到,在创建 *pa 的副本并将其传递给 f 并结束函数后,传递给 f 的副本 (*pa) 的析构函数没有被调用。 只有当 type() 结束(同一行)时,两个副本(我假设)都被析构函数删除

我确信在结束函数时将调用析构函数并删除当前副本,这在这种情况下没有发生。我想对代码中构造函数和析构函数的调用顺序进行解释(我对涉及方法的顺序不是很了解,我在网上找不到太多相关信息)。

谢谢。

当您执行 f(*pa).type(); 时,A 的复制构造函数将使用 A 对象调用,因此它将创建一个 A 以传递给您的 f 函数。当 f returns 时,它是一个不同的 A 被 returned,因为它不是由 ref,但是,它不会立即被销毁,而是使用复制省略来保留直到在调用 .type() 之后。

在那之后,传递给 f 的临时对象和 f 的临时对象 return 的析构函数都被销毁,所以 ~A() 被调用两次。