好吧,先说一下问题吧!
在之前测试中,程序运行正常,今天突然间就挂掉了,然后各种调试之后,才发现是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()的使用除非你能百分比确定容器非空,不然最好还是使用前判空再使用吧。