请考虑以下代码:
vector<int> myVector;
myVector.push_back(10);
myVector.erase(myVector.end());
Run Code Online (Sandbox Code Playgroud)
此代码在Windows(VisualStudio)上编译并运行良好,但在使用g ++编译时会导致Linux上的段错误.用pop_back替换擦除解决了Linux上的问题.
有谁知道为什么两个平台上的行为不同,以及要考虑的行为是正确的.
提前致谢!
end() 通常返回数组中的无效位置(超出结束的位置).
pop_back() 删除向量中的最后一项.
如果要擦除,则必须在erase(end() - 1);此处end() - 1返回最后一项的迭代器.
erase(end()) 应该调用UB - 我认为这是正确的......
编辑:正如马丁指出的那样,在调用之前erase(end() - 1),检查向量是否为空!