您的位置:首页 > 其它

使用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……

例:



测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: