使用Memcheck发现常见的内存问题
2015-10-22 18:31
197 查看
1、使用未初始化的内存
全局变量和静态变量的初始值均为0,而局部变量和动态申请的变量,其初始值为随机值。如果程序使用了随机值的变量,那么程序的行为就变得不可预期。输出结果会显示:Conditional jump or move depends on uninitialized value(s) 即程序的跳转依赖于一个未初始化的变量。
例:
测试结果:
2、内存读写越界
当访问了不该访问或者没有权限访问的内存地址空间,比如访问数组时越界;对动态内存访问时超出了申请的内存大小范围。输出结果会显示: Invalid write of size 4; Invalid read of size 4
例:
测试结果:
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
例:
测试结果:
5、内存泄露
在程序中动态申请的内存在使用完后既没有释放也也法被程序的其他部分访问。 显示输出结果如下:96 bytes in 1 blocks are definitely lost in loss record 2 of……例:
测试结果:
相关文章推荐
- mysql抢单
- 10.22记
- Android中实现蓝牙录放音
- android RecyclerView的基本介绍及用法(一)
- Unsupported major.minor version 51.0错误
- iOS中的数据传输(HTTP协议)
- BAT 批量提取文件夹内文件名
- 性能诊断:当输入一个网址后回车,实际发生什么
- 1022词法分析编写心得
- 登录centos虚拟机后显示-bash-4.1
- No.1_NABCD模型分析
- 用JS获取地址栏参数的方法(超级简单)
- scrapy [boto] ERROR: Caught exception reading instance data URLError: <urlopen error [Errno 10051] >
- Url编码 + Base64编码
- php cli模式学习(PHP命令行模式)
- Android_UiAutomator(安卓UI自动化)环境搭建
- python实现字典的键值对互换的三种方法
- 淘宝运营:26天营业额翻15倍!从3000/天到45000/天
- linux mount nobody nogroup
- 搜索技术的娱乐化扩展--综艺节目预测