在系统开发过程中出现的bug相对而言是比较好解决的,花费在这个上面的调试代价不是很大,但是在系统集成后的bug往往是难以定位的bug(最好方式是打桩,通过打桩可以初步锁定出错的位置,如:进入函数前打印日志,离开时再次打印日志)。而这些难以定位的bug基本分为2类:内存错误和并非问题。

1、内存泄露
如果在堆栈上分配的内存使用完成后没有释放就会造成内存泄露。少量的内存泄露不至于让程序崩溃,但是大量的内存泄露就会导致内存耗尽,后续内存分配失败,从而导致程序崩溃。长时间运行软件,即使只有一两处泄露,同样会导致程序崩溃。所以有当出现内存泄露请检查是否释放了资源。

2、内存越界访问
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程序就立即崩溃。如果所读的内存地址是有效的,在读的时候不会出现问题,但是由于读到的数据是随机的,他会产生不可预料的后果,另一种是写越界,又叫缓冲区溢出。所写的数据是随机的,他也会产生不可预料的后果。

内存越界访问造成的后果非常严重,是引起程序不稳定的主要原因之一,最主要的是它造成的后果是随机的,表现出来的症状和时机也是随机的,让bug的现象和本质看似没有什么联系,这给bug定位带来了极大的困难。所以在时机开发过程中,对于外部传入的参数要仔细检查。

3、野指针
释放掉的内存会被内存管理器重新分配。此时野指针指向的内存已经被赋予新的意义。对野指针指向的内存访问,无论是有意的还是无意的,都会为此付出巨大代价,因为它造成的后果,如果越界访问一样是不可预料的。解决野指针最好的方法:释放内存后立即把对应指针置为空值。

4、访问空指针
在访问指针指向的内存时,确保指针不是空指针。访问空指针指向的内存,通常会导致程序崩溃,或者不可预料的错误。

5、引用未初始化的变量
未初始化变量的内容是随机的,使用这些数据会造成不可预料的后果,调试这样的bug也非常困难。最好的解决办法:在声明变量的时候就对它进行初始化。

6、不清楚的指针运算
如:int *p=....;
p+n等价于(size_t)p+n*sizeof(*p);

7、结构体成员顺序变化引发的错误

8、结构体大小变化引发的错误

9、分配释放不配对

10、返回指向临时变量的指针
栈里面的变量时临时的,当前函数执行完成时,先关的临时变量和参数都被清除了。不能把指向这些临时变量的指针返回给调用这,这样的指针执行的数据是随机的,会给程序造成不可预料的后果。

11、试图修改常量
如:char *p="1234";
*p='1';

12、误解传值和传引用

13、重名符号
关于重名问题可以参考:C++重定义解决方法总结

14、栈溢出

15、误用sizeof
C++通常是按值传递参数,而数组则是例外,在传递数组参数时,数组退化为指针(及按引用传递),此时用sizeof是无法获取数据的大小。

16、字节对齐
字节对齐主要目的是提高内存访问效率,在某些平台上,就不仅仅是效率问题,如果不对齐得到的数据是错误的。大多数情况下编译器会保值全局变量和临时变量按照正确的方式对齐。内存管理器会保证动态按照正确的方式对齐。要注意的是:在不同的类型的变量之间转换时要小心。
字节对齐也会造成结构体大小的变化,在程序内部用sizeof来取的结构的大小就可以了。若数据要在不同的机器间传递时,在通信协议中要规定对齐的方式,避免对齐方式不一致引发的问题。
关于字节对齐问题请参考:关于C++内存中字节对齐问题的详细介绍

17、字节顺序
字节顺序历来是设计跨平台最头痛的问题。字节顺序是关于数据在物理内存中的布局问题,最常见的字节顺序有两种:大端模式和小端模式
大端模式:高位字节数据存放在低地址处,低位字节数据存放在高地址处。
小端模式:低位字节数据存放在内存低地址处,高字节字节数据存放在内存高地址处

如:long n=0x11223344
模式第1字节 第2字节第3字节  第4字节
大端模式0x110x220x330x44 
小端模式0x440x330x220x11

在普通软件中,字节顺序问题并不引人注目。而在开发与网络通信和数据交换有关的软件时,字节顺序就要多注意了。

18、多线程共享变量没有用valotile修饰
valotile作用:告诉编译器不要把变量优化到寄存器中。在开发多线程的程序是,如果这些线程共享一些全局变量,这些全局变量最好使用valotile修饰。这样可以避免因为编译器优化而引起的错误。

基于C++中常见内存错误的总结相关推荐

  1. Android稳定性系列-01-使用 Address Sanitizer检测原生代码中的内存错误

    前言 想必大家曾经被各种Native Crash折磨过,本地测试没啥问题,一到线上或者自动化测试就出现各种SIGSEGV.SIGABRT.SIGILL.SIGBUS.SIGFPE异常,而且堆栈还是崩溃 ...

  2. java常见的报错_Java中常见的错误有哪些?

    原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...

  3. 数据可视化过程中常见的错误类型

    数据可视化是一个沟通复杂信息的强大武器.通过可视化信息,我们的大脑能够更好地抓取和保存有效信息,增加信息的印象.但如果数据可视化做的较弱,反而会带来负面效果.错误的表达会损害数据的传播,完全曲解他们. ...

  4. 大内高手—常见内存错误

    大内高手-常见内存错误 转载时请注明出处:http://blog.csdn.net/absurd 随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器.这是有道理的,原 ...

  5. 大内高手 常见内存错误

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 大内高手 ...

  6. php中常见的错误类型有,JavaScript中常见的错误类型有哪些?(详细介绍)

    在JavaScript中,当发生错误时会生成描述错误类型的错误对象,此错误对象包含错误类型和编号等信息,这些信息可用于后续处理等,在本篇文章中将给大家介绍常见的错误类型以及如何处理这些错误. Java ...

  7. 错误 未找到引用源_你不理解的EXCEL函数中常见的错误值,都在这里

    今天我们来聊聊EXCEL函数中常见的错误值 使用EXCEL一定会用到函数公式,,使用函数公式计算分析数据,不免会遇到出错的情况, 但是出错后不知道错误原因,为什么会返回错误值,所以你的函数还不能自己优 ...

  8. 计算机错误符号,解析Excel中常见的错误符号以及解决方法

    解析Excel中常见的错误符号以及解决方法分享给大家, Excel 电子表格是很多人都要使用的软件,也相信很多人都会用,但是用得好不好就差别很大了,用得好的话可以让工作效率大大提高,但关于Excel的 ...

  9. ASP 中常见的错误 80004005 信息

    ASP 中常见的错误 80004005 信息 错误信息 Microsoft JET Database Engine 错误 '80004005' 未指定的错误 (Provider 错误) 原因: 权限问 ...

最新文章

  1. tp3 普通模式url模式_《终身成长》:三个步骤打造成长型思维模式,普通人也可以成功...
  2. 优秀的程序员都在哪里 如何寻找优秀的程序员?
  3. 【Unity】12.5 Navmesh Obstacle组件
  4. TCP/UDP,SOCKET,HTTP,FTP协议简析
  5. 【AI学院】新手如何学CV?老司机带学有三书籍《深度学习之图像识别》,赠书8本...
  6. python excel模板 插件_python脚本——自动推送txt,EXCEL等文件模板
  7. 卷积,DFT,FFT,图像FFT,FIR 和 IIR 的物理意义
  8. 教育启蒙赛道、亿级异构数据不停服平滑迁移方案和实践
  9. ArcGIS Pro 简明教程(2)基础操作和简单制图
  10. Mysql短连接风暴
  11. 应邀参加51CTO专家座谈门诊——驱动开发技术探析【2008.11.20在线】
  12. CocosCreator休闲游戏发布到字节跳动平台
  13. 鄙人最新作JS自动适应的图片弹窗
  14. PTA 7-128 大于m的最小素数
  15. 取消参考文献自动编号_毕业论文给尾注加[ ]及删除自动编号
  16. php彩蛋入侵,这隐藏彩蛋,可太牛批了!
  17. oracle查询存储过程完整的sql,SQL命令查询Oracle存储过程信息(代码内容等)
  18. Thrift入门学习
  19. SonarQube速查手册
  20. 搭建直播平台什么样的服务器最合适?

热门文章

  1. navigator.geolocation的应用 - 将定位信息显示在百度地图上
  2. LINUX 内存使用情况
  3. Nagios_在不同平台下的安装
  4. ubuntu 安装过程所需软件
  5. HTML中放置CSS的三种方式和CSS选择器
  6. 信息采集-火车采集器
  7. VB与Java颜色值的转换
  8. E24- please install the following Perl modules before executing ./mysql_install_db
  9. python cookbook 笔记三
  10. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路