在系统开发过程中出现的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字节
    大端模式    0x11        0x22        0x33        0x44             
    小端模式    0x44        0x33        0x22        0x11
    在普通软件中,字节顺序问题并不引人注目。而在开发与网络通信和数据交换有关的软件时,字节顺序就要多注意了。

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

[转]C++常见内存错误汇总的更多相关文章

  1. Python常见的错误汇总

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 错误: [错误分析]第二个参数必须为类,否则会报TypeError,所以正确的应 ...

  2. Quartus II 中 Verilog 常见警告/错误汇总

    Verilog 常见错误汇总 1.Found clock-sensitive change during active clock edge at time <time> on regis ...

  3. Jmeter工具做性能测试 常见的错误汇总

    在Win机器上用Jmeter做性能测试,汇总下我自身遇到的错误和解决方案 java.net.BindException: Address already in use: JVM_Bind 原因分析:压 ...

  4. 2018.6.10 Oracle数据库常见的错误汇总

    1.ClassNoFoundException 找不到注册驱动 可能原因:1>驱动名称不对 2>没有导入数据库驱动包 2.SQl 语句中可以使用任何有效的函数,函数操作的列,必须指定别名, ...

  5. 李洪强iOS开发之OC常见错误汇总

    // //  main.m //  16 - 常见错误汇总 // //  Created by vic fan on 16/7/13. //  Copyright © 2016年 李洪强. All r ...

  6. PHP常见错误汇总

    日常开发和调试的时候,经常会遇到一些错误,光怪陆离的不知所以,所以,特此将错误汇总一下,借鉴!!! 1. 原因分析:  一般可能是该文件出现了问题,检查一下代码和格式,是否出现开始的地方出现了空格,或 ...

  7. Entity Framework学习笔记——错误汇总

    之前的小项目做完了,到了总结经验和更新学习笔记的时间了.开始正题之前先啰嗦一下,对之前的学习目标进行一个调整:“根据代码生成表”与“生成数据库脚本和变更脚本”合并为“Code First模式日常使用篇 ...

  8. php常见细节错误

    PHP编程中10个最常见的错误 PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. ...

  9. spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式

    我们知道,spark中每个分片都代表着一部分数据,那么分片数量如何被确认的呢? 首先我们使用最常见的HDFS+Spark,sparkDeploy的方式来讨论,spark读取HDFS数据使用的是spar ...

随机推荐

  1. flex基础学习

    Flex是Adobe开发的一种RIA,富互联网应用,用Flex开发的东西都可以使用Flash做出来,但是Flex主要是面向的程序开发人员,前台使用ActionScript和MXML. 上面介绍了fle ...

  2. php读取excel日期类型数据的例子

    提供一个读取的函数:  代码如下 复制代码 //excel日期转换函数function excelTime($date, $time = false) { if(function_exists('Gr ...

  3. 测试使用Windows Live Writer

    目前是在win7系统下面使用的,曾经在winxp下去配置,却失败了,难道不支持xp? Windows Live Writer好像不支持代码关键字高亮显示啊. int main(void) { prin ...

  4. 拥抱ARM妹纸第二季 之 第一次 点亮太阳

    上次做鱼缸LED灯时还有很多材料正好拿来用.穆等等哥- 俺去找材料. 材料列表     3W LED   x  3     散热片     x  1     恒流IC     x  1     其他零 ...

  5. mysql学习笔记之基础篇

    数据库学习之基础篇 ① 开放数据库互连(Open Database Connectivity,ODBC ② 结构化查询语言(Structured Query Language) ③ 进入mysql:M ...

  6. python之super()函数

    python之super()函数 python的构造器奇特, 使用魔方. 构造器内对基类对象的初始化同样也很奇特, 奇特到没有半点优雅! 在构造器中使用super(class, instance)返回 ...

  7. 【linux】

    virtualbox   hyper-v     vmware      KVM      LXC Utils       Docker

  8. ASP.NET MVC 技术债务

    ASP.NET MVC 缓存.本地化和监控诊断 ASP.NET MVC 认证与授权 Entity Framework 创建数据模型

  9. [ios]ipad下的splitViewController 让你的APP看起来酷酷的!

    在ipad下可以使用splitViewController splitViewController下包含两个viewController 这是一种将屏幕一分为二的方式. 在水平状态下会出现成两个左右两 ...

  10. JSP:useBean,setProperty的使用

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...