您的位置:首页 > 运维架构

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

2013-10-23 14:51 776 查看
这个错误其实很简单,如果编码时注意的话根本就不会犯。

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

someHeader.h

std::vector<SomeClass> m_someClass;


someSource.cpp

// code here

m_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检查是必要的。

谨记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: