基于C++中常见内存错误的总结

 更新时间:2020年4月25日 17:47  点击:1545

在系统开发过程中出现的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修饰。这样可以避免因为编译器优化而引起的错误。

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++如何删除map容器中指定值的元素详解

    map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
  • C++ 约瑟夫环问题案例详解

    这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 基于C++中常见编译错误的总结详解

    本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • c++优先队列(priority_queue)用法详解

    这篇文章主要介绍了c++优先队列(priority_queue)用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25