vector元素内的c++对象复制重复次数多于预期
c++ object copy inside vector element repeats more than expected
我创建了一个虚拟类的两个对象,并将它们推入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)
。
相关文章:
- 适用于大型数组的无复制线程安全环形缓冲区
- 复制构造函数优先于移动构造函数
- 错误:在"模板"之前预期主表达式,具有算法的复制功能
- 复制<Interface>作用类似于值的类的shared_ptr
- 保证复制 elis 是否适用于函数参数?
- 复制 std::vector,但将 lambda 应用于每个元素
- 对C++所做的更改使复制初始化适用于具有显式构造函数的类
- C++:读取.BMP文件时出现问题;文件结束时间早于预期
- 预期';' - 我从学习资源复制了此代码,但它不起作用
- 将数组复制到向量中未按预期发生
- 当涉及分配器时,是否有类似于复制和交换习惯用法的东西
- 移动构造函数相对于复制构造函数的优势是什么?复制构造函数使用bool来表示是复制还是移动
- vector元素内的c++对象复制重复次数多于预期
- 复制省略和移动语义没有按预期工作
- C++ 矢量复制适用于一个向量,但不适用于另一个向量
- 复制构造函数调用了 2 次,而不是预期的 3 次
- 没有按预期调用复制构造函数
- 复制省略和返回值优化相对于复制构造函数
- 不依赖于原始的c++复制数组
- 模板构造函数优先于普通复制和移动构造函数