- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
技术中心-技术男 运行时错误: 异常:很多类型的运行时错误可以作为异常被捕获,但不是所有。为了保证C/C++的效率,有些错误是用其他的机制来通知程序:Linux系统下是用信号(signal 机制,Windows系统下是中断。 慎用:异常的抛出和捕获,是非常耗时的操作(比普通的语句慢两个数量级)。 退出:运行时出现未被处理的错误, 进程将会退出 规避策略: Code Review 测试 面向错误设计 健壮的代码[下面介绍] 开启监控进程, 自动重启 重启记录写入log 方便追查错误 地址越界 访问外部内存空间 : 注意: 下标越界,不论读写都会出错的。要从逻辑上加以判断。 申请的空间偏小,对所有类型的数组都可能发生. fprintf作为另一种字符串操作的方法也容易出现该类问题 strncpy snprintf strncat 也只是不抛异常,但是不保证逻辑上的正确性,而且需要要手动结束字符串以确保逻辑安全。 野指针 变量没有被初始化 建议:给所有的变量初始化 指针被free或者delete之后,没有置为NULL 指针被释放两次 指针操作超越了变量的作用范围 不要返回指向栈内存的指针或引用, 因为栈内存在函数结束时会被释放 传递异常的参数值,方法抛异常 警惕那些不平则鸣的方法 : 1. 系统函数对于异常的参数值会抛异常 2. 自己实现的方法或是其他第三方的类库方法也很可能对异常的输入抛异常 建议: 自己实现的方法要对输入健壮: 每个方法都做参数合法性检查 尽量用返回值表示错误,而不是抛异常 隐性的,低效的 不假设其他的方法对输入健壮: 检查为null, 超长等参数正确性的代价通常是很小的 不应该把异常的参数值传给其他方法,通常没必要,也不安全。 其他: 空指针:对为空的指针取值 指针在使用前确保不为NULL. 分母为0的除法 … 数据类型溢出(向上,向下) 问题:当无符号整形num 0时num -1和num– 都是要溢出. 建议: uint32_t 改成 int32_t, 或者: 全局变量局部变量同名 这是不规范的 这是没有必要的 这是危险的 没给输出参数初始化 Stl的find方法得到的iterator一定要与end 比较。 因为iter end 时iter的值是未初始化的. 未释栈空间, 内存溢出 递归函数是这类问题的典型 处理的方法是把递归问题转换为迭代问题,用栈类型模拟递归的过程. 未释堆空间, 内存泄露 数组只释放了第一个元素 只new, 不delete 建议:new/delete 应该配对出现. 函数多个出口,执行delete 前退出了方法 未释放资源 STL的许多容器都有size ,size 是个慢操作 特别是对于list类型,size 的时间复杂度是o N ,N是元素个数. 其他容器没有准确数据 建议: 判断是否为空用empty 想获得大小,最好自己计数 map set 参数值传递 注:这里方法是只读的,否则不只性能差,还有逻辑错误 快的判断排在condition前面 if testSet.empty a b if a b testSet.empty 58学院系列课程 C++编程常见错误 背景 收集了一些C++编程过程中常见的错误,大致分成了四种类型,与大家分享 主要内容 运行时错误 逻辑错误 累积错误 性能差的代码 运行时错误 运行时错误 char *pSrc 123456; int srcSize strlen pSrc ; char *pDst new char[srcSize]; // fix: char *pDst new char[strlen pSrc +1]; strcpy pDst, pSrc ; // fix: strncpy pDst, pSrc, strlen pDst ; pDst[strlen pDst ] ‘\0’; int dstSize strlen pDst ; int dstIndex 100; char pDstChar pDst[dstIndex]; // fix: if dstIndex dstSize char pDstChar pDst[dstIndex]; 运行时错误 char *pSrc; // char *pSrc NULL; int num 0; while pSrc! NULL num++; // 不确定的值 pSrc++; If pSrc! NULL *pSrc; int size 100; char *pSrc new char[size+1]; // pSrc[0] ‘\0’; int num 0; wh
文档评论(0)