【发布时间】:2012-02-13 23:54:17
【问题描述】:
我不确定这段代码有什么问题:
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
似乎在空向量上调用 back() 会使程序崩溃。
我不明白它为什么会崩溃?在调用back()之前我们需要检查向量的长度吗?还是可能是一个错误?
文档说,如果向量是空的,它会返回一个未定义的值。
【问题讨论】:
-
我怀疑这相当于有人给您 -1 以使用 MSDN 作为您的参考而不是 C++ 标准。实现者可以进一步定义他们的实现在标准说是UB的情况下做什么,所以如果MS想要保证
back()在空向量上使用时会返回,他们有权这样做。如果您使用的是 MSVC++,那么您有权阅读他们的文档。但它可能改为 -1,因为没有意识到以任何方式使用“未定义值”会导致崩溃。 -
@SteveJessop 我认为 MSDN 是 C++ 标准的实现。但是,在有效元素上调用方法(据我所知,空的 is 向量是有效元素)会使我的程序崩溃,这感觉很奇怪。好吧,如果标准是这样说的,那就这样吧:)
-
MSVC++ 是(大约)C++ 标准的一个实现。如果标准没有说明行为,其他实现的行为会有所不同。标准没有定义在空向量上调用
back()的原因是实现不需要特殊情况代码。因此,他们可以选择比必须检查向量是否为空时更快,并在不同情况下做不同的事情。当你做错事时,它们很容易崩溃(或更糟)。这可能感觉很奇怪,但这是语言设计的一部分。
标签: c++ visual-c++ stl stdvector std