C/C++实际开发中常见问题及预防、定位方法系列(一)

  • 0

C/C++实际开发中常见问题及预防、定位方法系列(一)

 

本系列文章整理C/C++实际开发中常见问题及预防、定位方法。本站原创,转载请注明

C语言是一门非常强大的编程语言,相对于其他语言,C语言最大的优势是可以直接操作内存,C++完全兼容C语言,并在此基础上又新增了面向对象的编程思想。也正因为C/C++可以直接操作内存,稍有不慎,便会造成系统崩溃,即使系统运行正常,其中也经常隐藏着一些隐患,这些隐患就像定时炸弹,随时可能导致系统崩溃。

正所谓隐患险于明火,防范胜于救灾。本系列文章的第一篇主要关注由不良代码习惯引起的隐患。

1、变量不初始化

很多初学者不喜欢对变量初始化,这在大部分情况下不会出现问题。但是一旦不慎使用到了未初始化的变量的值,轻则程序直接崩溃退出,重则程序正常但是运行结果错误。相对于定位问题的时间,给变量赋个初值这时间真的可以忽略不计。

2、使用不带n的标准库函数

典型的就是strcpy,sprintf等函数,这个习惯相信我们在学校就被一直教导。这些函数本身没什么问题,但是因为没有边界检查,使用过程可能会出现内存越界溢出,几乎每个编译器在检测到使用此类函数时都会出现警告。即使是这样仍然有很多人不遵守这习惯,对这样的童鞋,我中心昂,等你们真正参与一个真正意义上的系统项目后才会明白习惯的重要性。

3、不做参数检查

对输入参数作检查能够快速定位问题所在,相对于出现后果后这个成本也不高。

4、用有符号数和无符号数做比较

这么做的结果是你调试了很久发现某个条件永远是真或者是假。

5、“==”写成了“=”

造成的结果和第4条类似。有一个方法可以避免这问题。
if(p==NULL)写成if(NULL==p)
这样如果出现笔误在编译时就会报错

6、滥用全局变量

全局变量在很多时候非常必要,但是这会破坏模块的封装性,在移植扩展的时候会比较麻烦
如果涉及到多线程编程的时候,全局变量需要增加线程同步的开销。

7、参数传递使用值传递

对占用内存较小的类型可以使用值传递。但是如果变量的内存占用很大使用值传递将会占用很大的栈空间。

8、使用递归

没错,虽然递归看上去是非常高大上的解决方案,但是在实际项目中递归很有可能会导致占用太多栈空间导致溢出。

9、函数中途返回

函数中途不是不能返回,但是在C语言中由于经常需要从堆上申请资源,这类资源是需要我们自己去释放的,如果函数中途返回很容易导致我们忘了释放资源。所以在中途返回的时候一定要记得释放资源。C++中使用类封装可以很好的避免这个问题。

10、释放内存后没有把指针清空

这个问题其实可以和问题1对应,可能会导致我们使用已经释放了的内存。


About Author

深圳市闻道软件有限公司

闻道软件工作室

Leave a Reply