C++面试常见题目4_内存管理,内存泄露
-
内存管理
-
常见内存错误及解决方案
- 内存未分配成功,但使用它。解决方案:在使用内存之前检测指针是否为空。
- 内存分配成功,但尚未初始化就引用了它。解决方案:初始化。
- 内存分配成功,但越界访问。解决方案:循环等语句中注意边界。
- 忘记释放内存,导致内存泄露。解决方案:new/delete和malloc/free使用次数必须相同。
- 已经释放内存,但仍然使用它。解决方案:free或delete后,将指针设为NULL,避免产生”野指针“;内存函数中return写错,返回了指向栈中的指针或引用;程序中对象的关系过于复杂,难以搞清哪个对象是否已经释放了。
-
内存泄露 定义:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 发生方式
- 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。
- 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。
- 一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。
- 隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。
-
检测方法
- 静态分析技术
- 源代码插装技术
- 目标代码插装技术
- 被测代码预处理
- 测试执行阶段
- 数据统计与结果汇总
检测工具
- MS C-Runtime Library内建的检测功能;
- 外挂式的检测工具,诸如,Purify,BoundsChecker等;
- 利用Windows NT自带的Performance Monitor。
- 这三种工具各有优缺点,MS C-Runtime Library虽然功能上较之外挂式的工具要弱,但是它是免费的;Performance Monitor虽然无法标示出发生问题的代码,但是它能检测出隐式的内存泄漏的存在,这是其他两类工具无能为力的地方。
-
内存溢出
- 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。内存溢出可能是内存泄露引起的。
本系列文章目的为个人准备面试的简单总结,文中多有不足,敬请批评指正!