C++ C++;STL矢量前端值未清除

C++ C++;STL矢量前端值未清除,c++,vector,stl,C++,Vector,Stl,为什么我在清除向量后得到前元素值? 我错过了什么明显的东西吗?我也尝试过使用擦除功能,得到了同样的结果。这里的预期结果是什么?向量的大小在清除后也显示为0,但vect.front()显示一个值。 我的代码如下: #include<iostream> #include<vector> using namespace std; int main() { vector <int> vect; vector <int>::i

为什么我在清除向量后得到前元素值? 我错过了什么明显的东西吗?我也尝试过使用擦除功能,得到了同样的结果。这里的预期结果是什么?向量的大小在清除后也显示为0,但vect.front()显示一个值。 我的代码如下:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
        vector <int> vect;
        vector <int>::iterator it;
        vect.push_back(10);
        vect.push_back(3);
        vect.push_back(5);
        for( int i=0;i<vect.size();i++)
        {
                cout<<vect[i]<<endl;
        }
        vect.clear();
        cout<<"front element "<<vect.front()<<endl;
        cout<<"last element "<<vect.back()<<endl;
        if(vect.empty())
                cout<<"empty"<<endl;
        return 0;
}
对空向量(或任何容器)调用
front()
back()
未定义的行为,因此任何事情都可能发生

碰巧的是,当您
clear()
std::vector时,您正在从中“擦除”元素,因为
size()
减小了,但内部数组的物理内存仍然被分配,而
capacity()
保持不变


因此,在
front()
的情况下,可能会返回对所分配内存前端的有效引用,但您将输出仍然存在于该内存位置但在技术上过时且无效的旧数据。但是,在
back()
的情况下,它无法返回对任何有效内存的引用,因此从中输出的数据是不确定的。

您不应该在空向量上调用
front()
尝试在空向量上调用
front()
。这意味着如果您这样做,标准不会指定程序的行为,因此实际上任何事情都可能发生。这包括崩溃、计算机爆炸或只是获取一些垃圾值。访问空向量的前元素是UB。简单地说,“您只是输出仍然存在的旧数据”-可能仍然存在。对于整数向量,清除该向量不会覆盖旧数组内容,它只是减少
大小()
,将旧值留在内存中,即使它们不再被引用。矢量不会覆盖不再使用的旧阵列插槽,但从标准的角度来看,它们仍将被分配,因为它会破坏对象。也许,从实际的角度来看,很少有实现会在数据类型微不足道的情况下浪费CPU周期“破坏”单个元素。但是不管怎样,这都是未定义的行为和特定于实现的,因此不应该依赖于可能是这样的,但是编译器很可能会利用元素被破坏的事实,因此对它们的任何访问都会调用UB,除非是写操作。编译器喜欢利用UB。
nm@nm:~$ g++ vectortest2.cpp
nm@nm:~$ ./a.out
10
3
5
front element 10
last element 0
empty
nm@nm:~$