这个错误其实很简单,如果编码时注意的话根本就不会犯。
然而恰恰被我犯了,于是记下一笔。
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情况下的弹出操作做规定。
摘抄如下: