企业官网网站建设,网站建设公司 温州,东莞寮步华衍学校,wordpress的vieu4主题破解版1 内存泄露分析
在堆上分配的内存#xff0c;没有及时释放掉#xff0c;以便后面其它地方可以重用。在C/C中#xff0c;内存管理器不会帮你自动回收不再使用的内存。如果你忘了释放不再使用的内存#xff0c;这些内存就不能被重用#xff0c;就造成了所谓的内存泄露。
一…1 内存泄露分析
在堆上分配的内存没有及时释放掉以便后面其它地方可以重用。在C/C中内存管理器不会帮你自动回收不再使用的内存。如果你忘了释放不再使用的内存这些内存就不能被重用就造成了所谓的内存泄露。
一两处内存泄露通常不至于让程序崩溃也不会出现逻辑上的错误当然了量变会产生质变一旦内存泄露过多以致于耗尽内存后续内存分配将会失败程序可能因此而崩溃。 内存访问越界使用的内存超出了向系统申请了一块内存覆盖该空间之后的一段存储区域导致系统异常。
常见原因 1.写越界又叫缓冲区溢出所写入的数据对别人来说是随机的它也会产生不可预料的后果。 向10个字节的数组写入了20个字节;内存操作越界。 如char szText[10];memset(szText,0,30); //访问越界了10字节空间修改了30字节
2.读越界即读了不属于自己的数据如果所读的内存地址是无效的程度立刻就崩溃了。如果所读内存地址是有效的在读的时候不会出问题但由于读到的数据是随机的它会产生不可预料的后果。
内存越界访问造成的后果非常严重是程序稳定性的致命威胁之一。更麻烦的是它造成的后果是随机的表现出来的症状和时机也是随机的让BUG的现象和本质看似没有什么联系这给BUG的定位带来极大的困难。
一些工具可以够帮助检查内存越界访问的问题但也不能太依赖于工具。内存越界访问通常是动态出现的即依赖于测试数据在极端的情况下才会出现除非精心设计测试数据工具也无能为力。工具本身也有一些限制甚至在一些大型项目中工具变得完全不可用。比较保险的方法还是在编程是就小心特别是对于外部传入的参数要仔细检查。
2 内存泄漏检测工具Valgrind的安装与使用
Valgrind是一个Linux平台的内存调试工具。它允许你在Valgrind自己的环境中运行你的程序监视内存使用例如调用malloc和free(或者是C中的new和delete)。如果使用未初始化的内存数组访问越界或者忘记释放指针Valgrind就能够检测出来。使用valgrind之前 当然是要拥有它了。
2.1 Valgrind的安装
Valgrind地址https://valgrind.org/downloads/current.html Valgrind可以在线安装当然也可以使用源码安装。
如果你是Ubuntu系统直接使用以下命令安装Valgrind即可。
$sudo snap install valgrind # version 3.21.0, or $sudo apt install valgrind # version 1:3.15.0-1ubuntu9.1
Valgrind最新的版本是V3.21.0直接下载valgrind-3.21.0.tar.bz2压缩包进行源码安装。 $tar -xvf valgrind-3.21.0.tar.bz2 $./configure --prefix/usr/local/valgrind $make $sudo make install
使用以上命令valgrind就安装在你的系统里面了不管使用在线安装还是源码安装只要能安装上Valgrind就行。
2.2 valgrind的使用
valgrind能够发现使用非法的堆内存。下面就使用valgrind来查看内存泄漏。
#include stdlib.hvoid fun(void)
{int* x malloc(10 * sizeof(int));x[10] 0; // problem 1: heap block overrun
} // problem 2: memory leak -- x not freedint main(void)
{fun();return 0;
}$ gcc main.c -g -o main 值得注意的是变异需要加-g参数。 $ valgrind --toolmemcheck --leak-checkfull ./main
4813 Memcheck, a memory error detector
4813 Copyright (C) 2002-2017, and GNU GPLd, by Julian Seward et al.
4813 Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
4813 Command: ./main
4813
4813 Invalid write of size 4
4813 at 0x10916B: fun (main.c:6)
4813 by 0x109180: main (main.c:11)
4813 Address 0x4a50068 is 0 bytes after a block of size 40 allocd
4813 at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
4813 by 0x10915E: fun (main.c:5)
4813 by 0x109180: main (main.c:11)
4813
4813
4813 HEAP SUMMARY:
4813 in use at exit: 40 bytes in 1 blocks
4813 total heap usage: 1 allocs, 0 frees, 40 bytes allocated
4813
4813 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
4813 at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
4813 by 0x10915E: fun (main.c:5)
4813 by 0x109180: main (main.c:11)
4813
4813 LEAK SUMMARY:
4813 definitely lost: 40 bytes in 1 blocks
4813 indirectly lost: 0 bytes in 0 blocks
4813 possibly lost: 0 bytes in 0 blocks
4813 still reachable: 0 bytes in 0 blocks
4813 suppressed: 0 bytes in 0 blocks
4813
4813 For lists of detected and suppressed errors, rerun with: -s
4813 ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)可以看到有对泄漏信息进行检测有两个错误并且指出产生泄漏的代码及代码行数。