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

Getting front() Of Empty vector Yields Unexpected Behavior

本文关键字:意外 向量 front 获取      更新时间:2023-10-16

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

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。

访问

vectorfront()未定义的行为,因此您一定不能这样做,并且如果您这样做,则无法从程序的明显行为中推断出任何内容。

queue.size().erase电话会议之前少了一个,这一事实应该告诉您erase奏效了。

很可能,您正在进入未定义的行为。矢量不必将内存清零。

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

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

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

此外,尝试运行在调试模式下编译的代码,在调用 front() 时会得到一个断言,预计会发生崩溃。始终在调试模式下运行新代码,这就是它的用途。