【C++编程规范】编程需要避免的常见错误

时间:2024-04-23 16:04:06

前言

C++有不少陷阱或者容易失误的地方,稍不注意就会导致程序bug。

正文

1.无符号数和有符号数比较

#define只是简单的文本替换,如果替换的是简单数值,默认是int,和unsigned int比较或者位操作会隐式类型转换,结果可能不是我们期望的。

2. case和break配对出现

switch case break的语法中,case下的丢失了break就会继续下一个case的处理,代码检视需关注新增case是否有配对的break。

3.动态内存多次释放

内存的申请与释放应该存在配对关系,一次申请只对应一个释放出口,并且必定会有一个释放出口,释放内存前判断指针是否为NULL。

4.动态库的调用和实现不一致

调用动态库时接口声明不一致,程序可以编译通过但运行失败。

5.函数返回临时变量

6.C字符串和string不可混用

C和string并不一样,需要混合使用时需进行转换。

7.数组长度越界

从文件读取记录,记录的长度往往是不确定的,出现一些超级长的记录很有可能,最好对输入长度进行判断,对超长的字符串采取保护措施,另外也可以用string代替字符串。

8. 文件操作

feof和fgets的返回值均要做判断, 根据返回值做处理。

9.数据类型的边界值判定

用int或者unsigned int等类型的值做判定时,需要注意不要超过边界值,比如不要用一个int和999999999999进行比较,超过int边界后的比较都是未定义的。

10.输入输出函数族使用错误

经常出现的错误是类型不匹配,导致访问越界。

11.数组下标保护

对数组进行下标操作时,要保证下标不越界。

12.函数的形参和实参不一致

不提倡使用隐式类型转换,如果实参是int*,形参是unsigned int*这种,函数内部处理的结果可能出乎意料。

13.野指针

释放指针指向的内存后及时置为NULL,使用指针前要判断是否为NULL。

14.构造函数的使用

类的所有成员都应当在构造函数中进行初始化,另外对类成员的初始化也只应该由构造函数进行,不要使用memset等内存操作函数对类对象进行操作。

15.动态库的内存释放

动态库有申请内存时,最好由动态库自行释放,避免模块耦合过深。

16.多线程链接数据库的设计

一个简化处理多线程链接数据库的方法是:并发控制交给数据库来做,程序的每个线程创建一个数据库链接。

17.多线程编程

需要用到一些不可重入函数时谨慎使用,对不可重入函数的调用加锁保护,另外有一些C库函数提供有可重入版本,多线程编程时调用对应的重入函数。

18.配对出现

new/delete、malloc/free、fopen/fclose、popen/pclose等需要配对出现的C库调用或者系统调用需检查是否严格配对,包括所有case。

19.STL容器

迭代器的边界通常是前闭后开区间,避免越界取值。

小结

暂时想到的就这些,欢迎朋友们补充。