vector元素内的c++对象复制重复次数多于预期

c++ object copy inside vector element repeats more than expected

本文关键字:于预期 复制 元素 c++ 对象 vector      更新时间:2023-10-16

我创建了一个虚拟类的两个对象,并将它们推入vector。但我看到构造器工作了五次。我很困惑。有人能帮忙吗?

#include <vector>
#include <iostream>
using namespace std;
int obj_id=1;
class dummy {
int d;
public:
dummy()// default constructor :
{ 
    d=obj_id++; 
    cout<< "dummy created :" << d <<" n"; 
}
dummy(const dummy & du) // copy constructor :
{
    d=obj_id++; 
    cout<< "dummy copy created :" << d <<" n"; 
}
~dummy() { cout<< "dummy destroyed :" << d << " n"; }
};
void generate(vector<dummy> &v) {
   for(int i=0;i<2;i++)
   {
       dummy x;
       v.push_back(x);
       cout<< "pushed into vector n";
   }
   return ;
}   
int main ()
{
vector <dummy> vd;
generate(vd);
cout<<" Created dummies n";
return 0;
}
=========================
Output:
dummy created :1 
dummy copy created :2 
pushed into vector 
dummy destroyed :1 
dummy created :3 
dummy copy created :4 
dummy copy created :5 ** how this comes **??
dummy destroyed :2 ** oops.. how the copy inside vector destroyed?
pushed into vector 
 destroyed :3 
 Created dummies 
dummy destroyed :4 
dummy destroyed :5 

偶数假体应该是向量元素的副本。但是第五个假人是怎么出现的呢?第二个dummy (vector的第一个元素)如何在从函数返回之前被销毁?

打开调试器,并在您的generate()循环中的每一行步进时关注向量的容量。第一次创建时,它的容量为0。它会根据需要自动增加容量,但它实际上会破坏现有的元素,并在掩护下重新创建它们。这就是导致你所看到的额外的create/destroy的原因。

在声明vector后添加vd.reserve(2);,此额外的创建/删除操作将消失。

当第二个dummy对象被压入vector时,vector太小而无法容纳所有虚拟对象,并且会被调整大小,从而导致额外的复制构造函数调用。

可以通过增加初始矢量容量来防止这种情况,例如使用vd.reserve(10)