我有一个向量,其中包含一个类对象。 我是这样声明的
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 时,我预计会出现段错误,因为我删除了向量中的第一个元素,之后大小为零。 我什至清除了向量,但 'queue.front' 仍然返回对象,并且 cout 语句仍然打印对象的 id。
访问空的 front()
的
vector
是 未定义的行为,所以你不能这样做,而且如果你这样做了,你也不能从程序的明显行为中推断出任何东西。
事实上
queue.size()
比 .erase
调用之前少了 1,这一事实应该告诉您 erase
已经起作用了。
您可能正在走向未定义的行为。向量不必将内存清零。
典型的向量实现通常有一个包含 16 个元素的堆栈缓冲区。将向量增长到该大小,并且不会发生内存分配。因此,即使删除元素后,内存仍然存在(就像缓存,但可以使用),除非飞机在析构函数上清理自身,否则您将看到相同的值。
做这个实验:在 Aircraft 析构函数中毒害 id(比如 -1234)并重新运行你的代码。将其仅作为学习实验,因为依赖诸如毒值之类的东西是不好的做法。
还要向矢量添加另一个项目,然后再次打印正面。您将获得新物品。
还可以尝试运行在调试模式下编译的代码,当调用 front() 时,您会在预期崩溃的地方得到一个断言。始终在调试模式下运行新代码,这就是它的用途。