我有一个包含类对象的向量。 我这样说了
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。
答案 0 :(得分:6)
未定义的行为来访问front()
的{{1}}是空的,所以你不能这样做,你不能从你的明显行为中推断出任何东西程序,如果你这样做。
vector
比queue.size()
调用之前少一个这一事实应该告诉您.erase
已经有效。
答案 1 :(得分:0)
可能,你正在走向未定义的行为。向量不必将内存清零。
答案 2 :(得分:0)
典型的向量实现通常具有16个元素的堆栈缓冲区。将向量增长到该大小并且不会发生内存分配。因此,即使在删除元素后,内存仍然存在(如缓存,但随时可以使用),除非Aircraft在析构函数上清理自己,否则您将看到相同的值。
执行此实验:在飞机析构函数中毒化id(例如-1234)并重新运行代码。保持它只是一个学习实验,因为依靠毒药这样的东西是不好的做法。
还要向矢量添加另一个项目,然后再次打印前面。您将获得新项目。
同时尝试运行在调试模式下编译的代码,并在调用front()时获得断言,以防止崩溃。始终在调试模式下运行新代码,这是它的用途。