惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - winterson

共享一个完美的WR wordfile,让你的Script在UE中更方便阅读 - winterson - 博客园 侃侃男人的品位:Boy to Man to Real Man!!! - winterson 一首好动情的歌,我喜欢 软件测试相关的63个国外站点 (原创)关于WR获取文件大小的解决方法 (原创)WinRunner数据库检查解决方案(一) - winterson - 博客园 测试需求定义(参考RUP测试实践) 最全的DOS命令 - winterson - 博客园 国内部分高校FTP站点 美国杂志300强及其网址 (转自51testing BBS)成功或失败前 请先全力以赴 (转载)跨越软件测试术语“拦路虎” 测试用例设计的误区 (转载)软件测试效率(test efficiency) TestDirector数据库移植到SQL Server后出现的问题及解决(一) 舒伯的生涯发展理论(转贴) QuickTest Professional 8 Tutorial 中文版 二篇自動化測試的文章 ( 來自 IBM ) 自動化 Windows Forms ( 來自微軟 )
常见的内存错误及对策
winterson · 2008-11-27 · via 博客园 - winterson

欢迎进入内存这片雷区,伟大的Bill Gates曾经失言:
    640k ought to be enough for everybody
                                                       --Bill Gates 1981
发生内存错误是件非常麻烦的事情,编译器不能自动发觉这些错误,通常在程序运行时才会出现,而这些错误大多没有明显的症状,时隐时现,增加了改错的难度,有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走了问题又开始做乱。
常见的内存错误及对策有以下几种:
1)内存未分配成功,就使用了它。
一般程序员都不会意识到内存会分配不成功,而直接使用了该指针;常用的解决方法:在使用内存之前检查指针是否为NULL,如果P是函数的参数,则需要在函数入口处用Assert(p!=NULL)进行检查;如果是用malloc或new来动态申请内存,则应该用if(p==NULL)或if(p!=NULL)
进行防错处理;常见的现象:程序运行一段时间后出现内存访问异常,但重启机器后又能正常运行;

2)内存虽然分配成功了,但未进行初始化就引用
内存的初始值究竟是什么,没有任何标准规定,尽管有时候是全零,但我们在分配完一块内存后,应该进行初始化;否则可能会导致一些莫名奇妙的问题出现,且很有可能无法重现的问题;

3)内存分配成功且初始化,但操作超过了内存边界;
例如在使用数组时经常发生下标“多1”或“少1”的操作,特别在for循环中,循环次数很容易搞错,导致数组越界,经典案例:
char Arr[10];
for(i=1;i<=10;i++)
{
     Arr[i]=i;
}
在数组越界的时候,什么样的问题都有可能发生,在VC6.0下可能是死循环,在VC2003下则提示数组访问越界等;

4)忘记释放内存,造成内存泄露
有这种问题的函数调用一次丢失一块内存,占的内存大,问题很快就出现,占的内存小,可能过一个月甚至一年或者更长时间才出现;为了避免类似问题,在使用malloc及free的次数一定要相等;

5)释放了内存却继续使用
    <1>程序中的对象调用关系复杂,实在难以搞清楚某个对象是否已经释放了内存;
   <2>函数的return语句写错了,注意不要返回指向栈空间的指针或者引用,因为该内存在函数退出时自动被销毁;
   <3>使用了free及delete后,没有将指针改成NULL,导致了“野指针”;