C++ 为什么调用std::vector::back()会使我的程序崩溃

C++ 为什么调用std::vector::back()会使我的程序崩溃,c++,visual-c++,stl,stdvector,std,C++,Visual C++,Stl,Stdvector,Std,我不确定这段代码有什么问题: std::vector<int> myVector(0); if (myVector.back() == 12) myVector.push_back(12); std::vector myVector(0); if(myVector.back()==12) myVector.push_back(12); 似乎对空向量回调()会使程序崩溃 我不明白它为什么会崩溃?调用back()之前是否需要检查向量的长度?或者可能是一个bug 文档中说,如

我不确定这段代码有什么问题:

std::vector<int> myVector(0);

if (myVector.back() == 12)
    myVector.push_back(12);
std::vector myVector(0);
if(myVector.back()==12)
myVector.push_back(12);
似乎对空向量回调()会使程序崩溃

我不明白它为什么会崩溃?调用
back()
之前是否需要检查向量的长度?或者可能是一个bug

文档中说,如果向量为空,它将返回一个未定义的值

我们需要在回调()之前检查向量的长度吗

一句话:是的。这是你的bug,你的向量是空的,所以没有“back”元素


文档应该说明(如果它说了什么的话)对空向量调用
back()
会导致未定义的行为,而不是返回未定义的值。

23.3.2.8/3

为零大小数组调用front()或back()的效果尚未确定


由于行为未定义,任何事情都可能发生。您很幸运遇到了崩溃。

出于某种原因,MSDN确实说“返回值未定义”()。但它也表示,“当使用_SECURE_SCL 1编译时,如果您试图访问空向量中的元素,则会发生运行时错误”。我不知道(a)为什么MS将引用称为“值”,或者(b)他们如何将“未定义值”的概念与使用时导致运行时错误的引用的概念进行平方。但那个运行时错误很可能和提问者描述的“崩溃”一样。我仍然认为对有效元素调用方法会使我的程序崩溃是很奇怪的。@MBen:但向量中没有元素;向量中至少有一个元素是
back()
的先决条件。这就是接口的定义方式。在尝试调用
back()
@MBen:读回您的注释之前,您需要确保您的输入符合前提条件,当您说“在有效元素上”时,您是指“在有效对象上”吗?我想我可能误解了你所写的。“查尔斯贝利:对不起,我是说一个空向量是一个有效的元素,它不是垃圾或空,这就是为什么我感到惊讶:-我怀疑它相当于有人给你1,使用MSDN作为你的参考而不是C++标准。实现者可以进一步定义他们的实现在标准规定为UB的情况下所做的工作,因此如果MS希望保证在空向量上使用时
back()
将返回,他们有权这样做。如果您使用的是MSVC++,那么您有权阅读他们的文档。但是,如果不是意识到使用任何“未定义的值”,都可能导致崩溃,那么它可能是-1。“我认为MSDN是C++标准的实现。但在有效元素上调用方法(据我所知,一个空的is向量是有效元素)会使我的程序崩溃,这感觉很奇怪。如果标准是这样说的,那么,它是:)MSVC++是(大约)C++标准的一种实现。如果标准没有说明行为,则其他实现的行为会有所不同。该标准没有定义在空向量上调用
back()
,其原因是实现不需要特殊情况下的代码。因此,如果他们必须检查向量是否为空,并且在不同的情况下做不同的事情,他们可以选择更快的速度。当你做错事时,他们很容易崩溃(或更糟)。这可能感觉很奇怪,但这是作为语言设计的一部分所做的权衡。我不认为我很幸运,对有效值调用方法会使我的程序崩溃,这感觉很奇怪。@MBen在UB上有一个程序崩溃是好的,因为很容易捕捉错误。当它有时有效,有时无效时,很难找到bug。我同意。我只需要确保向量有元素:-)