在系统开发过程中出现的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. MDX : Non Empty v/s NonEmpty

    MDX : Non Empty v/s NonEmpty User Rating: / 50 PoorBest Written by Jason Thomas    Friday, 07 May 20 ...

  2. 关于JS异步加载方案

    javascript延迟加载的解决方案: 1.使用defer标签 <span style="font-size: small;"><script type=&qu ...

  3. 使用dxNavBar动态创建应用程序菜单

    一.如何动态创建dxNavBar内容: function TMain.GetAcitonByCaption(const aCategory,aCaption: string): Integer; va ...

  4. 正确处理WPF中Slider值改变事件的方式

    最近在用WPF数据绑定重写一下播放器项目时遇到的关于Slider的问题,在窗体透明度调节和播放进度调节上用了Slider控件.调节窗体透明度我是 这么想的:将窗体的Opacity属性的值与Slider ...

  5. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  6. margin-top相对谁的问题

    根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边距重叠.意思便是:如果你只想margin相对于父标 ...

  7. Team Homework #2

    王宇杰,北航计算机学院2011级本科生,学号11061180.本人没有什么特长,典型的死宅一个.学过一点c和java.对于第一次的个人作业就表示亚历山大,希望各位大神不吝分享自己的代码,并做好注释.希 ...

  8. WPF解析TTF 字体

    偶遇需要自己解析 TTF 字体并显示,此做... using System; using System.Collections.Generic; using System.Drawing.Text; ...

  9. [Android] ImageView.ScaleType设置图解 【转载】

    ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等. 设置的方式包括: 1. 在layout xml中定义android:s ...

  10. dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表

    今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...