【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容器
迭代器的边界通常是前闭后开区间,避免越界取值。
小结
暂时想到的就这些,欢迎朋友们补充。
【C++编程规范】编程需要避免的常见错误的更多相关文章
- 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...
- Batsing的网页编程规范(HTML/CSS/JS/PHP)
特别注意!!!我这里的前端编程规范不苟同于Bootstrap的前端规范. 因为我和它的目的不同,Bootstrap规范是极简主义,甚至有些没有考虑到兼容性的问题. 我的规范是自己从编程实践中总结出来的 ...
- Python 编程规范-----转载
Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器,默认保存为 utf-8 格式. ...
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- 中兴软件编程规范C/C++
Q/ZX 深圳市中兴通讯股份有限公司企业标准 (设计技术标准) Q/ZX 04.302.1–2003 软件编程规范C/C++ 20 ...
- Java编程规范实践
一个好的编程规范可以让代码易于理解,具体的操作却不必如此麻烦. 本文包含以下内容: Eclipse Java代码Formatter配置 Eclipse 代码模板配置 自动添加Javadoc注释 附录: ...
- (转)C++ 编程规范
转载地址:http://www.cnblogs.com/len3d/archive/2008/02/01/1061902.html C/C++编码规范 今天人们越来越明白软件设计更多地是一种工程,而不 ...
- .Net程序员学用Oracle系列(3):数据库编程规范
<.Net程序员学用Oracle系列:导航目录> 本文大纲 1.书写规范 1.1.大小写风格 1.2.缩进风格 1.3.换行 1.4.其它 2.命名规范 2.1.数据库对象命名 2.2.变 ...
- iOS扩展——Objective-C开发编程规范
最近准备开始系统学习一个完整项目的开发流程和思路,在此之前,我们需要对iOS的开发变成规范进行更系统和详尽的学习,随意对编程规范进行了整理和学习.本文内容主要转载自:Objective-C-Codin ...
- FangDD Java编程规范
我们采用<Oracle/Sun原生的Java编程规范>和<Google Java编程规范> Google Java编程风格指南 January 20, 2014 作者:Haws ...
随机推荐
- WCF的行为与异常-------配置文件说明
ServiceBehavior and OperationBehavior(这些都是应用在实现类上) http://msdn.microsoft.com/zh-cn/library/system.se ...
- Source Insight 安装使用
习惯了在source insight下编辑阅读源码,在linux下用vi总是用不好 ,还是在Ubuntu上用回熟悉的source insight. 在Ubuntu中,安装Windows程序用wine, ...
- 使用PHP处理POST上传时$_FILES数组为何为空
在做一个简单的表单上传测试时,服务端的php脚本中,$_FILES数组为空;这样就不能获取从浏览器上传的信息.什么原因呢? 通过Google,找到下面这个web: php上传文件$_FILES数组为空 ...
- 【HDOJ】3727 Jewel
静态区间第K大值.主席树和划分树都可解. /* 3727 */ #include <iostream> #include <sstream> #include <stri ...
- poj 3087 Shuffle'm Up ( map 模拟 )
题目:http://poj.org/problem?id=3087 题意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s ...
- C# 分布式缓存服务器方案
- JQuery设置与获取RadioButtonList和CheckBoxList的值
有这样一个问题,要获取ASP.NET控件RadioButtonList的值,首先想到的就是$("#<%=RadioButtonList1.ClientID %>").v ...
- CSS sprites 技术
Css Sprites 技术逐渐流行,各大网站上都可以看到它的身影. 但从本质上,Css Sprites 只是 Css 技术的一个使用小窍门,初学者也能快速上手. Css Sprites 简单解释: ...
- 【众秒之门 JavaScript与jQuery技术精粹 #BOOK#】第1章 初学JavaScript需知的七件事
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- 0、IOS8:Xcode6 playground
一.Playground介绍 Playground是Xcode6中自带的Swift代码开发环境.俗话说“功欲善其事,必先利其器”.以前在Xcode5中编写脚本代码,例如编写JS,其编写过程很痛苦,Xc ...