【吃一堑】vector的pop_back使用错误造成的core dump
2013-10-23 14:51
776 查看
这个错误其实很简单,如果编码时注意的话根本就不会犯。
然而恰恰被我犯了,于是记下一笔。
someHeader.h
someSource.cpp
就是一个出栈操作,这个操作在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/
If the container is not empty,
the function never throws exceptions (no-throw guarantee).
Otherwise, it causes undefined behavior.
其实这是一个不该犯的错误,在任何弹出操作前都进行empty检查是必要的。
谨记。
然而恰恰被我犯了,于是记下一笔。
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检查是必要的。
谨记。
相关文章推荐
- vector::pop_back,错误延迟发生
- 使用vector::push_back时,Release模式发生错误void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
- warning C4251: “std::vector<_Ty>”需要有 dll 接口由 class“Test”的客户端使用错误
- 转摘--MS SQL Server 2000 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
- 使用to_number,to_char转换的连接列易造成错误的执行计划
- popViewControllerAnimated 的错误使用
- Apache 2.2 使用经验谈,不易被发现的小错误会造成大问题
- 使用gdb和core dump如何快速定位到段错误
- 【转】VC中的class“std::vector<_Ty>”需要有 dll 接口由 class“Test”的客户端使用错误
- mysql SKIP-NAME-RESOLVE 错误的使用时机造成用户权限
- vc 无法检测到COM的错误使用造成的内存泄露
- 粗心造成的小错误!时间控件使用时的问题!
- SVMcgForClass函数报错分析 错误使用 svmtrain (line 233) Y must be a vector or a character array. 出错 SVMcgForCla
- vector删除元素之pop_back(),erase(),remove()
- release对象过度使用,造成野指针错误
- C++ 使用vector 出现"vector iterator not incrementable"或"vector iterator + offset out of range"错误的情况
- c++ vector push_back 出错或者错误
- C++中,结构体vector使用sort排序(以及sort参数错误问题)
- 使用gdb和core dump如何快速定位到段错误
- vector 的删除操作pop_back、erase效率对比