请考虑以下代码:
vector<int> myVector;
myVector.push_back(10);
myVector.erase(myVector.end());
此代码在Windows(VisualStudio)上编译并运行正常,但在使用g ++编译时会导致Linux上的段错误。用pop_back替换擦除解决了Linux上的问题。
有谁知道为什么两个平台上的行为不同,以及需要考虑的行为是正确的。
提前致谢!
答案 0 :(得分:9)
end()
通常会在数组中返回一个无效位置(一个超出结尾)。
pop_back()
删除了向量中的最后一项。
如果你想擦除,你必须erase(end() - 1);
这里end() - 1
返回最后一项的迭代器。
erase(end())
应该调用UB - 我认为这是正确的......
编辑:正如Martin所说,在调用erase(end() - 1)
之前,检查向量是否为空!
答案 1 :(得分:0)
end()
指向无处,这已经超越了结束。
答案 2 :(得分:0)
myVector.end()
未指向向量的最后一个元素。它指向过去向量的最后一个元素。但是,我不确定这是否属于未定义的行为(如果确实如此,那么Windows和Linux的行为就不同了。)
答案 3 :(得分:0)
myVector.end()
在向量中的最后一个元素之后为你提供了一个向右的迭代器。因为那里没有任何东西,所以在它上面调用擦除没有多大意义。
我很想知道当你打电话时Visual Studio正在做什么。运行一些测试以查看它是否实际上正在从您的向量中删除10
,或者是否只是优雅地忽略了您的错误请求。