C++中vector调用push_back后为何输出多余默认构造对象?
问题原因
核心问题出在vector的初始化逻辑:
vector<Person> per(3);
这行代码会创建一个初始长度为3的vector,内部的3个元素会自动调用Person的无参默认构造函数初始化。你实现的默认构造函数没有对_name、_age两个成员做赋值操作,其中_age属于未初始化的int类型,值是不确定的(本次运行输出为-1属于未初始化的随机值),_name则默认是空字符串。
后续调用3次push_back,是在已有的3个默认构造对象的末尾追加3个自定义对象,此时vector总长度为6。范围for循环会遍历全部6个元素,因此会先输出3条无效数据,再输出3条你预期的正确数据,和实际运行结果完全一致。
修复方案
两种常用修复方式二选一即可:
- 方案一:初始化vector时不指定初始长度,创建空容器后再插入元素
将vector<Person> per(3);修改为vector<Person> per;,后续调用3次push_back后容器长度就是3,遍历输出的全是有效数据。 - 方案二:保留初始长度,直接通过下标给对应位置赋值
删掉3个push_back语句,改为直接给已初始化的3个位置赋值:per[0] = p1; per[1] = p2; per[2] = p3;
内容的提问来源于stack exchange,提问作者Jayesh
相关产品推荐
相关产品推荐

