std::list::back带来的坑

好吧,先说一下问题吧!
在之前测试中,程序运行正常,今天突然间就挂掉了,然后各种调试之后,才发现是list.back()导致访问越界, 更让人无语的是,gdb调试时,程序崩溃的地方却不是访问越界的地方, 没办法,只能一步步的打印日志了,最后才找到罪魁祸首!所以今天就特地学习并记录下。

出错场景

// 定义一个list
std::list<StructA> A_List;
// 取最后一个元素
StructA A = A_List.back();
// 输出结构体的元素
std::cout<< A.a  <<std::endl

函数介绍

back()返回容器的最后一个元素,对于空的容器,调用back()返回的是不确定的内容
看一下英文介绍:

Returns a reference to the last element in the list container.

Unlike member list::end, which returns an iterator just past this
element, this function returns a direct reference.

Calling this function on an empty container causes undefined behavior.

之所以出现这个问题,就是因为不知道空容器返回的元素是未定义的,我一直默认当作如果容器为空,就会返回一个构造好的结构体。。。

注释

对于一个容器c,表达return c.back(); 相当于{ auto tmp = c.end(); –tmp; return *tmp; }

总结

最近出现的两个问题,一个c_str(), 一个back(), 都是因为只会用而没有去学习,大概就是知道它是干嘛的。。。
最后,对于back()的使用除非你能百分比确定容器非空,不然最好还是使用前判空再使用吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechGenius

文章很值,请作者喝一杯咖啡吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值