c/c++语法陷阱

记录工作中遇到的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,因此导致重复释放,造成挂机。

猜你喜欢

转载自blog.csdn.net/weixin_59665492/article/details/119028710