C++编程常见错误_技术中心_第1页
C++编程常见错误_技术中心_第2页
C++编程常见错误_技术中心_第3页
C++编程常见错误_技术中心_第4页
C++编程常见错误_技术中心_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+编程常见错误技术中心-技术男背景收集了一些C+编程过程中常见的错误,大致分成了四种类型,与大家分享主要内容运行时错误逻辑错误累积错误性能差的代码运行时错误运行时错误: 异常:很多类型的运行时错误可以作为异常被捕获,但不是所有。为了保证C/C+的效率,有些错误是用其他的机制来通知程序:Linux系统下是用信号(signal)机制,Windows系统下是中断。慎用:异常的抛出和捕获,是非常耗时的操作(比普通的语句慢两个数量级)。退出:运行时出现未被处理的错误, 进程将会退出规避策略:lCode Reviewl测试l面向错误设计l健壮的代码下面介绍l开启监控进程, 自动重启l重启记录写入log

2、方便追查错误运行时错误地址越界地址越界(访问外部内存空间):注意:下标越界下标越界,不论读写都会出错的。要从逻辑上加以判断。,不论读写都会出错的。要从逻辑上加以判断。申请的空间偏小申请的空间偏小,对所有类型的数组都可能发生,对所有类型的数组都可能发生. . fprintf作为另一种字符串操作的方法也容易出现该类问题作为另一种字符串操作的方法也容易出现该类问题strncpy () snprintf() strncat()strncpy () snprintf() strncat()也只是不抛异常,但是不保证逻辑上的正确性,而且需要要也只是不抛异常,但是不保证逻辑上的正确性,而且需要要手动结束字符

3、串以确保逻辑安全。手动结束字符串以确保逻辑安全。char *pSrc=123456;int srcSize=strlen(pSrc);char *pDst=new charsrcSize; / fix: char *pDst=new charstrlen(pSrc)+1;strcpy(pDst, pSrc); / fix: strncpy(pDst, pSrc, strlen(pDst); pDststrlen(pDst)=0;int dstSize=strlen(pDst);int dstIndex=100;char pDstChar = pDstdstIndex; / fix: if(ds

4、tIndex = 0; m-)void process(uint32_t num, char *pArr)/ 倒序遍历for(uint32_t n= 0; nnum; n+)uint32_t m=num-n-1;逻辑错误全局变量局部变量同名全局变量局部变量同名这是不规范的这是不规范的 这是没有必要的这是没有必要的这是危险的这是危险的int num=0;for(int i=0;isizeA;i+)int num=0; / 同名变量,局部优先同名变量,局部优先.for(int k=0; ksizeB;k+) num+;fprintf(stdout, “num:%d.n”, num); / 0逻辑错

5、误没给输出参数初始化没给输出参数初始化void process(char *pArr, int &num) / 开头就应该给输出参数赋默认值num=0 char *pArr=NULL;while(pArr!=NULL)num+;pArr+; int num=0;process(“ABC”, num); / num=3, Okprocess(“ABC”, num); / num=6, unexpected.逻辑错误StlStl的的findfind方法得到的方法得到的iteratoriterator一定要与一定要与end()end()比较。比较。 因为因为iter=end()iter=en

6、d()时时iteriter的值是未初始化的的值是未初始化的. .mapuint32_t, vector :iterator iter = dataMap.find(10);if(iter !=dataMap.end()else iter.second-size(); / 未初始化的值逻辑错误不同类型间比较:uint32_t a=100;int32_t b=-1;if(a pLeft); PrintTrees(pNode-pRight);PrintTrees(pTreeRoot); / 数的高度为1000000必死int PrintTrees(TreeNode *pRootNod) stack

7、nodeStac; nodeStac-push(pRootNode); TreeNode *pNode=NULL; while(!nodeStack-empty() pNode=nodeStack.top(); nodeStack.pop(); print(pNode); nodeStack-push(pNode-pLeft); nodeStack-push(pNode-pRight); 累积错误未释堆空间, 内存泄露数组只释放了第一个元素只new, 不delete 建议:new/delete 应该配对出现.函数多个出口,执行delete 前退出了方法 char *pSrc=new char1

8、024;delete pSrc; / delete pSrc;void process() char *pSrc=new char1024; / 应该配对出现应该配对出现 delete pSrc;void process(bool bReturn) char *pSrc=new char1024; if(bReturn) return; delete pSrc; / 没有执行到没有执行到累积错误未释放资源FILE *rFile = NULL;char *pCurFIleName=NULL;while(true) pCurFIleName=GetCurFileName(); rFile = fo

9、pen(pFileName, rb); / 缺少fclose(fFile);性能差的代码STL的许多容器都有size() ,size()是个慢操作 特别是对于list类型,size()的时间复杂度是o(N),N是元素个数. 其他容器没有准确数据建议:判断是否为空用empty()想获得大小,最好自己计数性能差的代码map setmap set参数值传递参数值传递 注注: :这里方法是只读的,否则不只性能差,还有逻辑错误这里方法是只读的,否则不只性能差,还有逻辑错误int Sum(set dataSet) / set &dataSetuint32_totoal=0;for(set:itera

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论