[英]C++ std::vector segfault when using erase(), ok when using pop_back() with g++
请考虑以下代码:
vector<int> myVector;
myVector.push_back(10);
myVector.erase(myVector.end());
该代码可以在Windows(VisualStudio)上编译并正常运行,但是使用g ++进行编译时会在Linux上产生段错误。 用pop_back替换擦除可解决Linux上的问题。
有谁知道为什么这两种平台上的行为不同,以及什么行为可以纠正。
提前致谢!
end()
通常会在数组中返回无效位置(超出末尾的位置)。
pop_back()
删除向量中的最后一项。
如果要擦除,则必须erase(end() - 1);
在这里end() - 1
将迭代器返回到最后一项。
erase(end())
应该调用UB-我认为是正确的...
编辑:正如马丁指出的那样,在调用erase(end() - 1)
,请检查向量是否为空!
end()
指向无处,那是无尽的。
myVector.end()
不指向向量的最后一个元素。 它指出过去的向量的最后一个元素。 但是,我不确定这是否属于未定义的行为(如果确实如此,则Windows和Linux行为不同是合理的)。
myVector.end()
为您提供一个迭代器,使您可以在向量中的最后一个元素之后进行迭代。 由于那里没有任何东西,因此对其进行呼叫擦除没有多大意义。
我很好奇地想确切地知道当您调用Visual Studio时在做什么。 运行一些测试,以查看它是否实际上已从引导程序中擦除10
,或者只是从容地忽略了您的错误请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.