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()
被调用两次。
我得到了这个代码:
编辑:完整代码:
#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()
被调用两次。