linux查看内存memcheck,使用Memcheck发现常见的内存问题

本文详细解析了C/C++编程中常见的内存管理问题,包括未初始化的变量导致的不可预期行为、内存读写越界、内存覆盖、动态内存管理错误以及内存泄露。这些错误可能导致程序崩溃或产生不可预知的结果。通过理解并避免这些错误,可以提高程序的稳定性和安全性。
摘要由CSDN通过智能技术生成

1、使用未初始化的内存

全局变量和静态变量的初始值均为0,而局部变量和动态申请的变量,其初始值为随机值。如果程序使用了随机值的变量,那么程序的行为就变得不可预期。

输出结果会显示:Conditional jump or move depends on uninitialized value(s)即程序的跳转依赖于一个未初始化的变量。

例:

a6db39aa66d341e015351d0637516b32.png

测试结果:

d29aff719d1cde5530157a16a6cd6f5e.png

2、内存读写越界

当访问了不该访问或者没有权限访问的内存地址空间,比如访问数组时越界;对动态内存访问时超出了申请的内存大小范围。

输出结果会显示:Invalid write of size 4; Invalid read of size 4

例:

1ce5f1d5956c3416c26b5faf9031a405.png

测试结果:

c571b0052e29e4677922e8af4d6e81b2.png

3、内存覆盖

使用C标准库中的strcpy strncpy memcpy strcat时,需要设置源地址(src)和目标地址(dst),src和dst所指向的地址不能发生重叠,否则结果将不可预期。

输出结果会显示:Source and destination overlap in strncpy(dst地址,src地址,地址相差长度)

4、动态内存管理错误

全局变量属于静态存储,它们是在编译时就被分配了存储空间,函数内的局部变量属于栈上分配,而最灵活的内存使用方式当属堆上分配,也叫做内存动态分配了。常用的内存动态分配函数包括:malloc, alloc, realloc, new等,动态释放函数包括free, delete。用malloc/alloc/realloc方式申请的内存,用free释放;用new方式申请的内存用delete释放。

当申请与释放不一致时,即类似于用malloc申请却用delete释放显示输出结果如下:

Mismatched free() /delete/delete[]

当申请与释放不匹配时,即申请了多少内存却没有释放完或者多释放了,显示输出结果如下:

Invalid free() /delete/delete[]

当释放后仍然读写时,即如果内存释放后再被访问,就可能覆盖其他部分的信息,显示输出结果如下:Invalid write of size 1

例:

426bc29b044dcfe17ed9fb8e8627b5ae.png

测试结果:

4372337b925f749dd8e206f54b884b10.png

5、内存泄露

在程序中动态申请的内存在使用完后既没有释放也也法被程序的其他部分访问。 显示输出结果如下:96 bytes in 1 blocks are definitely lost in loss record 2 of……

例:

fb20ab71085b6973439f4256cd070f77.png

测试结果:

7823032d3afd8961d7ecdd45b306c06d.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值