我对以下代码感到困惑。
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A(int _a) : a(_a)
{
cout << "A(" << a << ") created" << endl;
}
~A()
{
cout << "A(" << a << ") deleted" << endl;
}
int a;
};
void test()
{
vector<A> as;
A a1(1);
A a2(2);
as.push_back(a1);
as.push_back(a2);
cout << "test ended" << endl;
}
int main()
{
test();
return 0;
}
这是输出。
A(1) created
A(2) created
A(1) deleted <== ?
test ended
A(2) deleted
A(1) deleted
A(1) deleted
A(2) deleted
为什么要额外删除“ A(1)”?
我知道在执行push_back时存在隐式副本构造。但是,我的问题是为什么a1与a2区别对待?
答案 0 :(得分:0)
当您使用对象A1调用第一个vector#push_back
时,它将创建一个
使用副本构造函数复制对象A1。
当使用对象A2调用第二个vector#push_back时,它必须重新创建带有两个对象的矢量。因此,它将删除已复制的A1对象,创建另一个矢量,并添加A1和A2的新副本。这就是为什么您看到A1的第一个delete语句的原因。
最后,当程序退出时,A1和A2的副本都将被删除,这就是为什么您看到两个分别针对A1和A2的删除语句的原因。
如果创建的矢量初始大小为2个元素,则将看到为A1和A2创建的对象数量相等。只需
as.reserve(2);
创建两个对象的矢量,以便在按下第二个对象时不必重新创建矢量。
此外,如果您定义自己的副本构造函数,您将看到vector#push_back确切何时创建了对象的副本:
A(const A &obj) {
a = obj.a;
cout << "A(" << a << ") created in copy constructor" << endl;
}