使用erase()时的C++ std :: vector段错误,使用带有g ++的pop_back()时ok

rav*_*vil 1 c++ vector

请考虑以下代码:

vector<int> myVector;
myVector.push_back(10);
myVector.erase(myVector.end());
Run Code Online (Sandbox Code Playgroud)

此代码在Windows(VisualStudio)上编译并运行良好,但在使用g ++编译时会导致Linux上的段错误.用pop_back替换擦除解决了Linux上的问题.

有谁知道为什么两个平台上的行为不同,以及要考虑的行为是正确的.

提前致谢!

Nim*_*Nim 9

end() 通常返回数组中的无效位置(超出结束的位置).

pop_back() 删除向量中的最后一项.

如果要擦除,则必须在erase(end() - 1);此处end() - 1返回最后一项的迭代器.

erase(end()) 应该调用UB - 我认为这是正确的......

编辑:正如马丁指出的那样,在调用之前erase(end() - 1),检查向量是否为空!

  • 更优雅的恕我直言:`myVector.erase(myVector.rbegin());`,+ 1 btw. (4认同)