记录工作中遇到的bug(持续更新)
1、逗号运算符的错误使用
先看以下代码
这个代码我的原意是想让循环次数取较小的值,但是结果却发生了偏差,实际项目中就会出现内存越界。
回顾一下 for和逗号运算符的用法
for(表达式1; 表达式2; 表达式3){
语句块
}
它的运行过程为:
1) 先执行“表达式1”。
2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3) 执行完循环体后再执行“表达式3”。
4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。整个逗号表达式的值为系列中最后一个表达式的值
所以for循环中如果有逗号运算符,那么整个逗号表达式的最后一个表达式为真循环就会继续运行下去。
因此正确写法
2、结构体类型的变量的初始化
常见的两种初始化方式
struct stList A = {}; 或者 struct stList A;memset(&A, 0, sizeof(struct stList));
第一种方式实际上只给结构体中的每个成员变量初始化了,由于结构体对齐的原则,成员之间内存碎片是没有初始化的,虽然很多时候系统默认值就是0,但是我们并不能指望所有系统都是这样做的。
第二种则将整个结构体都初始化了。
通过示例程序帮助理解一下:
3、free/delete之后一定要赋NULL
delete/free一个指针之后,只是回收指针指向位置的空间,而指针本身的值不变。如果不赋NULL,后续用到此指针后就会发生莫名其妙的错误。
工作中遇到了一个设置OSD多次后偶现设备挂机的问题,且使用gdb也无法定位到问题。无奈使用打印大法,多次复现后发现以下代码段。
设置osd的时候需要加载用到的字库到内存,最多加载100个,后续如果有新的字需要加载 且100个已经全部占用时,会先销毁后面50个,给新的字形使用。由于销毁的时候delete之后没有赋NULL,导致 p_ttf->stUsedGlyf.p_letter[i]不等于NULL,因此导致重复释放,造成挂机。