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

本文记录了一次在Linux环境下,由于在空vector上调用pop_back()导致core dump的错误。错误源于vector在弹出非基本类型或非指针对象时,即使容器为空也会尝试析构对象。此问题在Windows上未引发问题,但C++标准并未明确规定empty时的行为。解决方案是在执行pop_back()前检查vector是否为空。
摘要由CSDN通过智能技术生成

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

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


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/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值