跟我学C++中级篇——常见的错误问题分析

235 篇文章 94 订阅

一、介绍

无论是菜鸟还是老鸟,在写C++代码时(也包括C中的部分),往往会犯一些常见的错误,可能这个错误回过头来看不算什么,但却经常让开发者忽视或者说忘记。这些问题大多都不是多么高深伯问题,修改后让人大呼真是大意了。很多问题,在前面的文章中都说明或者分析过,可能没有引起大家的重视,本文将其大略总结一下,以咨为正。

二、C++常见问题

在C++编程中常见的问题可以分为以下几大类:

A、基本语法问题

1、典型的类或结构体等定义后面丢失分号
2、只有函数定义声明,没有函数实现
3、函数默认参数定义方式不正确,比如没有严格按照从右到左的定义或者在函数实现中也进行了定义
4、类静态成员变量未初始化
5、函数返回了局部变量的引用或指针
6、深浅拷贝问题,导致的数据无法传递
7、乱使用异常(try...catch)
8、不同类型的转换特别是隐式类型转换,典型的如有符号和无符号的比较引起的
9、头文件包含错误,没包含或者重复包含,特别是包含顺序问题
10、标准升级导致的语法严格,如传统字符串字面量在C++11后默认定义已经是常量即char*s = "s"类似的定义语法错误
11、定义数组长度未使用常量
12、std::vector未初始化直接使用类似数组方式赋值如vec[1] = 3
13、乱使用auto定义,包括在返回值等使用时未限定条件
14、名空间的限制未加控制,包括未引用,未包含等
15、函数未声明在前,定义在后,顺序导致全局函数的无法引用
16、名字冲突,特别是名空间限制不完全时,与标准库冲突,如自己写了一个min或max同名的函数
17、浮点精度的控制问题,即准确性的小数位问题,典型的是浮点判断0的条件
18、无符号类型的溢出问题,如相减为负时其实是一个很大的数,如果做为循环条件则进入死循环

B、内存问题

1、野指针或者悬垂指针。这个是非常常见的
2、数组访问越界,包括通过指针访问
3、空指针未判断,包括指针初始化或释放未赋空值(但要看看前面文章中pimpl中智能指针的赋空值引起的问题)
4、指针的重复释放
5、内存释放的非匹配性,即new 和delete与malloc 和free必须成对使用,不能拆开使用
6、内存泄露,特别是内存的累积泄露;而智能指针(std::shared_ptr)的互相持有也会导致内存泄露

C、链接库问题

    1、缺少必要的库或库的类型、版本不匹配,动态库和静态库乱用
    2、不同的平台的库的导出限制和调用标准,如32平台上Windows有很多调用约定和C的定义方式
    3、库变量的加载顺序问题,此问题在前面反复分析过
    4、缺少依赖库,特别是环境库或者库的库依赖

D、其它

1、在一些IDE中,程序未终止,再次启动,特别是调试时可能引起各种问题
2、资源句柄未关闭,如文件或网络,导致资源无法被重复使用

以上就是比较常见的一些问题,当然可能有一些疏漏。不过诸如多线程或模板之类的比较高级的即使是常见问题也没列举,主要是大多数人用得还是少的。一般来说,在C/C++程序中,不建议使用异常。所以使用异常时要万分谨慎,特别是从别的语言转过来的开发者,一定不要用类似Java、C#等的异常控制思维来控制C++。

三、解决方式和手段

解决方式也有几大类:
1、先进工具的使用
使用一些好的IDE或者内存查看工具、静态分析工具等就可以检查很多内存的问题和语法问题。比如Qt IDE就可以自动生成类后面的分号,而不用自己想着。一些内存检查工具可以查检出大多数的内存泄露的风险。当然,最关键的起决定作用的仍然是开发者自身的水平。
2、编码风格处理及代码Review
使用良好的编码风格也可以解决很多如内存泄露的问题,如使用RAII可以有效的控制内存和资源泄露;通过版本动态控制库的较验和匹配。而及时有效的Review可以更早的暴露相关的问题。
3、使用先进的标准或者语法
可以使用C++11以后的语法或标准,使用其新功能新特性。比如上文提到的野指针有相当一部分情况可以使用智能指针来解决。在C++20中也可以通过span解决数组越界的问题。

四、总结

主要是总结常见问题或者说一些容易忽视的问题,所以对复杂和不太常见的就不提了。C++学习曲线比较陡峭,之所以想总结一下这些常见问题,就是给入门和初中级开发者一个借鉴。大家感兴趣的话可以在后面补充一些自己认为是常见的问题上来,共同进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值