C++中vector.reserve()引发元素值异常的原因及相关疑问
问题解答
1. 为何会出现意外值?
v.reserve(3)仅为vector预留了可容纳3个元素的内存空间,但vector的实际元素数量(size())仍为0。此时v.begin() + 1是越界的非法迭代器——空vector的合法插入位置只有begin()(与end()指向同一位置)。
使用非法迭代器执行insert属于C++标准定义的未定义行为,程序可能输出随机垃圾值、崩溃或产生其他不可预测结果,你看到的872456316就是内存中的随机脏数据。
而改为v.insert(v.begin(), 1)时,插入位置合法(空vector的起始位置),因此能正常插入元素1,输出符合预期。
2. 预留内存后能否先给第二个元素赋值?
不行。reserve仅改变vector的容量(capacity),不改变大小(size)——此时vector内没有任何有效元素,直接访问“第二个元素”的位置(比如用v[1]或插入到begin()+1)均属于未定义行为,与是否预留内存无关。
若想先操作第二个元素,需先将vector的size设置为3:
v.resize(3); // size变为3,元素被默认初始化为0 v[1] = 5; // 合法,修改第二个元素 v[0] = 10; // 再修改第一个元素
这样就能安全地按需求顺序赋值。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

