zoukankan      html  css  js  c++  java
  • 【C++编程规范】编程需要避免的常见错误

    前言

    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容器

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

      小结

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

  • 相关阅读:
    linux下文本处理
    JSON对象的序列化和反序列化
    大整数相加的js实现
    前端日志格式化
    对象deepcopy
    基于vue实现的小程序管理后台图文编辑器
    原型和原型链
    函数声明、函数表达式及函数立即执行
    网址
    判断日期是否相等
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/3824005.html
Copyright © 2011-2022 走看看