获取空向量的 front() 会产生意外行为
Getting front() Of Empty vector Yields Unexpected Behavior
我有一个向量,其中包含一个类对象。我这样声明
vector<Aircraft> queue;
我擦除矢量中的第一个元素。但它似乎是仍在向量中的第一个元素。我做到了。
queue.erase(queue->begin());
cout<<queue.size(); //printed 0
Aircraft temp = queue.front();
cout<<temp.id; //expected a segfault error
在我擦除第一个元素后,矢量的大小为 0(只有一个元素)。当我尝试查看 temp(飞机)的 id 时,我期待出现 seg 错误错误,因为我从向量中删除了第一个元素,之后大小为零。我什至清除了向量,但"queue.front"仍然返回对象,cout 语句仍然打印对象的 id。
访问
空vector
的front()
是未定义的行为,因此您一定不能这样做,并且如果您这样做,则无法从程序的明显行为中推断出任何内容。
queue.size()
比.erase
电话会议之前少了一个,这一事实应该告诉您erase
奏效了。
很可能,您正在进入未定义的行为。矢量不必将内存清零。
典型的向量实现通常有一个 16 个元素的堆栈缓冲区。将向量增大到该大小,不会发生 mem 分配。因此,即使在删除元素后,内存仍然存在(就像缓存一样,但可以使用),除非 Aircraft 在析构函数上自行清理,否则您将看到相同的值。
做这个实验:在飞机析构函数中毒害 id(比如说 -1234),然后重新运行你的代码。把它作为一个学习实验,因为依赖毒物值之类的东西是不好的习惯。
同时向矢量添加另一个项目,然后再次打印正面。您将获得新项目。
此外,尝试运行在调试模式下编译的代码,在调用 front() 时会得到一个断言,预计会发生崩溃。始终在调试模式下运行新代码,这就是它的用途。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中声明向量时出现意外错误
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 实现向量的push_back()函数会导致意外输出
- 初始化和显示整数向量时出现意外结果
- 结构向量的值发生意外变化
- 获取空向量的 front() 会产生意外行为
- 使用具有嵌套向量的迭代器的意外行为
- C++:向量获取意外数据
- C++/JNI-存储对象(jobject)在向量和数组中发生意外更改,C++或JNI问题
- 向量::擦除在类方法中不起作用,但在 main 中工作;没有编译器错误,只有意外的结果