【吃一堑】vector的pop_back使用错误造成的core dump

来源:互联网 发布:js设置option选中 编辑:程序博客网 时间:2024/06/10 06:46

这个错误其实很简单,如果编码时注意的话根本就不会犯。

然而恰恰被我犯了,于是记下一笔。


someHeader.h

std::vector<SomeClass> m_someClass;

someSource.cpp

// code herem_someClass.pop_back();// other code here


就是一个出栈操作,这个操作在Windows下不会有问题,但是在linux下会core dump。

看coredump文件发现是在SomeClass的析构里当的。


经过定位最后发现是因为在linux下的pop_back()操作不管容器是否为空,如果vector存放的是非基本类型、非指针的类对象,那么pop_back之后会对这个弹出的对象进行析构。所以在空vector上进行弹出后会在一个错误的地址上进行对象的析构。

Windows上的行为则和linux不一样,不会coredump,具体这两个编译器的差别没有细看。这两者之所以有区别是因为C++标准貌似没有对empty情况下的弹出操作做规定。

摘抄如下:

http://www.cplusplus.com/reference/vector/vector/pop_back/ 

Exception safety

If the container is not empty, the function never throws exceptions (no-throw guarantee).
Otherwise, it causes undefined behavior.


其实这是一个不该犯的错误,在任何弹出操作前都进行empty检查是必要的。

谨记。