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

问题描述 投票:0回答:3

我有一个向量,其中包含一个类对象。 我是这样声明的

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。

c++ stdvector
3个回答
6
投票

访问空的 front()

vector
未定义的行为
,所以你不能这样做,而且如果你这样做了,你也不能从程序的明显行为中推断出任何东西。

事实上

queue.size()
.erase
调用之前少了 1,这一事实应该告诉您
erase
已经起作用了。


0
投票

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


0
投票

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

做这个实验:在 Aircraft 析构函数中毒害 id(比如 -1234)并重新运行你的代码。将其仅作为学习实验,因为依赖诸如毒值之类的东西是不好的做法。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.