首页 > 代码库 > 内存泄露与内存访问越界

内存泄露与内存访问越界

内存泄露

在堆上分配的内存,没有及时释放掉,以便后面其它地方可以重用。在C/C++中,内存管理器不会帮你自动回收不再使用的内存。如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露。

一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃。




内存访问越界,使用的内存 超出了 向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常。

常见原因:

1 写越界,又叫缓冲区溢出

    
        向10个字节的数组写入了20个字节;内存操作越界,
如charszText[10];memset(szText,0,30); //访问越界了,10字节空间,修改了30字节
2 读越界,读了不属于自己的内存空间,所读地址无效,程序崩溃;地址有效,读到数据随机

排查内存越界错误的方法包括:

1.使用BoundChecker进行调试,BoundChecker在代码编译时加入了大量的附加处理,其中包括内存堆栈检测等,其实ms的debug模式也做了许多的类似操作,但debug模式下的一些代码行为,如初始化变量,和Release下的代码执行不同,所以用debug调试不是完美的方式

2.类内部出现莫名其妙的错误时,查看 this指针是否变化,必要的时候进行手手工检查
3.在调试的 "查看" 窗口 输入:@err,hr 看全局错误变量的内容
4.注释掉部分代码,看是否错误还出现,注释的最佳方式是:二分法
5.查看程序异常处的反汇编代码,分析原因
6.最后的办法:代码复查

引用http://www.51testing.com/?uid-51504-action-viewspace-itemid-96444

内存泄露与内存访问越界