首页 理论教育 C++静态检查技巧-零基础C++从入门到精通

C++静态检查技巧-零基础C++从入门到精通

时间:2023-08-20 理论教育 版权反馈
【摘要】:虽然也有一些检测调试内存泄漏的工具,但还是一开始就做好防范的效率更高。动手写15.2.1动手写15.2.1展示了将相等操作符误写成赋值操作符的情况。图15.2.1==和=在使用数组或者vector的时候,越界也是一个常见的错误。动手写15.2.3动手写15.2.3展示了返回局部对象引用的情况。

C++静态检查技巧-零基础C++从入门到精通

防患于未然,在一开始就把bug的火苗扑灭永远是最容易的做法。因此,与其花时间调试,不如避免错误,进行静态检查。所谓静态检查,就是过一遍代码,检查有哪些可能会导致错误但不一定现在就导致的问题。静态检查可以是人工的,也可以借助静态分析工具,比如Klocwork。我们可以一边写代码一边注意这些问题,也可以在编译前整体地查验一遍。下面我们来看一下C++中常见的容易导致错误的陷阱。

首先是初始化的问题。我们知道,使用未初始化的指针或者变量是很危险的,因为我们根本不知道它们的初值会是什么,在被使用的时候会有什么效果。本书中使用的VS2017的默认配置将会对未初始化变量的使用报错。

其次,还有一个最容易犯的错误就是在动态分配内存之后忘记释放内存,进而导致内存泄漏。虽然也有一些检测调试内存泄漏的工具,但还是一开始就做好防范的效率更高。在一些情况下,我们也可以采用全局内存池(Memory Pool)的设计,感兴趣的读者可以参考相关的资料。

另外一个容易犯的关于逻辑表达式的错误就是将相等操作符“==”误写成赋值操作符“=”。

动手写15.2.1

动手写15.2.1展示了将相等操作符误写成赋值操作符的情况。本来是判断num是否为4的代码,结果变成了把4赋值给num再判断num是否不为0。为了避免这种情况,我们可以将4写在左边,这样就算我们误写了,编译器也会报错,因为左值不能为常量。

图15.2.1 ==和=

在使用数组或者vector的时候,越界也是一个常见的错误。

动手写15.2.2

(www.xing528.com)

动手写15.2.2展示了数组越界的问题,运行结果如图15.2.2所示:

图15.2.2 数组越界

我们可以看到,本程序中循环的上限弄错了,数组有10个元素,但是程序打印了11个元素,超出数组范围以后就会获取内存中原有的垃圾数据,这可能会导致程序出现严重的异常。

动手写15.2.3

动手写15.2.3展示了返回局部对象引用的情况。运行结果如图15.2.3所示:

图15.2.3 返回局部对象引用

在这个示例中,虽然程序还是打印出了正确的值,但是返回局部对象的引用还是很危险的,因为返回值对象存放的内存已经释放,之后随时都有可能被新分配的对象占用,改成别的值。这里能够打印出正确的值只是凑巧而已。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈