获取空向量的front()会产生意外行为

时间:2012-06-08 17:42:29

标签: c++ stdvector

我有一个包含类对象的向量。 我这样说了

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。

3 个答案:

答案 0 :(得分:6)

未定义的行为来访问front()的{​​{1}}是空的,所以你不能这样做,你不能从你的明显行为中推断出任何东西程序,如果你这样做。

vectorqueue.size()调用之前少一个这一事实应该告诉您.erase已经有效。

答案 1 :(得分:0)

可能,你正在走向未定义的行为。向量不必将内存清零。

答案 2 :(得分:0)

典型的向量实现通常具有16个元素的堆栈缓冲区。将向量增长到该大小并且不会发生内存分配。因此,即使在删除元素后,内存仍然存在(如缓存,但随时可以使用),除非Aircraft在析构函数上清理自己,否则您将看到相同的值。

执行此实验:在飞机析构函数中毒化id(例如-1234)并重新运行代码。保持它只是一个学习实验,因为依靠毒药这样的东西是不好的做法。

还要向矢量添加另一个项目,然后再次打印前面。您将获得新项目。

同时尝试运行在调试模式下编译的代码,并在调用front()时获得断言,以防止崩溃。始终在调试模式下运行新代码,这是它的用途。