-1

我有一个向量,其中包含一个类对象。我这样宣布

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 (Aircraft) 的 id 时,我期待一个 seg 错误错误,因为我从向量中删除了第一个元素,之后大小为零。我什至清除了向量,但“queue.front ”仍然返回对象,并且cout语句仍然打印对象的 id。

4

3 回答 3

6

访问为空的 a是未定义的行为,因此您不能这样做,并且如果这样做,您将无法从程序的明显行为中推断出任何内容。front()vector

queue.size()比通话前少一的事实.erase应该告诉您这erase已经奏效了。

于 2012-06-08T17:45:39.700 回答
0

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

于 2012-06-08T17:44:07.753 回答
0

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

做这个实验:在飞机析构函数中毒化 id(比如说 -1234)并重新运行你的代码。把它当作一个学习实验,因为依赖诸如毒值之类的东西是不好的做法。

还要向矢量添加另一个项目,然后再次打印前面。你会得到新的物品。

还可以尝试运行在调试模式下编译的代码,当你调用 front() 时你会得到一个断言,你会期望崩溃。始终在调试模式下运行新代码,这就是它的用途。

于 2012-06-08T18:09:34.633 回答