我对下面的代码感到困惑。
#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是不同的?
发布于 2019-03-01 04:45:01
当你使用object constructor.
vector#push_back
创建你的object A1的副本,当你使用object A2调用第二个vector#push_back时,它必须使用两个对象重新创建向量。因此,它删除了复制的A1对象,创建了另一个向量,并添加了A1和A2的新副本。这就是为什么您会看到A1的第一个delete语句。
如果创建初始大小为2个元素的向量,您将看到为A1和A2创建的对象数量相等。只管去做
as.reserve(2);
创建两个对象的向量,以便在推送第二个对象时不必重新创建向量。
此外,如果您定义了自己的复制构造函数,您将看到vector#push_back准确地创建了您的对象的副本:
A(const A &obj) {
a = obj.a;
cout << "A(" << a << ") created in copy constructor" << endl;
}
https://stackoverflow.com/questions/54933730
复制相似问题