C++面试常见题目4_内存管理,内存泄露

  • 内存管理

  • 推荐一部内存管理的书籍,网上大部分相关博文均来源于此 https://download.csdn.net/download/zzhang_12/10541374
  • 定义:内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
  • 在C++中内存分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

    堆:堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

    栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配内容容量有限。

    自由存储区:自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。

    全局/静态存储区:这块内存是在程序编译的时候就已经分配好的,在程序整个运行期间都存在。例如全局变量,静态变量。

    常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量(const),不允许修改。

  • 常见内存错误及解决方案
  1. 内存未分配成功,但使用它。解决方案:在使用内存之前检测指针是否为空。

  2. 内存分配成功,但尚未初始化就引用了它。解决方案:初始化。

  3. 内存分配成功,但越界访问。解决方案:循环等语句中注意边界。

  4. 忘记释放内存,导致内存泄露。解决方案:new/delete和malloc/free使用次数必须相同。

  5. 已经释放内存,但仍然使用它。解决方案:free或delete后,将指针设为NULL,避免产生”野指针“;内存函数中return写错,返回了指向栈中的指针或引用;程序中对象的关系过于复杂,难以搞清哪个对象是否已经释放了

  • 内存泄露

  • 定义:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

  • 发生方式
  1. 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。

  2. 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。

  3. 一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。

  4. 隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。

  • 检测方法
  1. 静态分析技术
  2. 源代码插装技术
  3. 目标代码插装技术
  4. 被测代码预处理
  5. 测试执行阶段
  6. 数据统计与结果汇总

检测工具

  1. MS C-Runtime Library内建的检测功能;
  2. 外挂式的检测工具,诸如,Purify,BoundsChecker等;
  3. 利用Windows NT自带的Performance Monitor。
  4. 这三种工具各有优缺点,MS C-Runtime Library虽然功能上较之外挂式的工具要弱,但是它是免费的;Performance Monitor虽然无法标示出发生问题的代码,但是它能检测出隐式的内存泄漏的存在,这是其他两类工具无能为力的地方。
  • 内存溢出
  1. 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。内存溢出可能是内存泄露引起的。

 

本系列文章目的为个人准备面试的简单总结,文中多有不足,敬请批评指正!

参考:

https://www.cnblogs.com/lyl-312/p/5528892.html

https://www.cnblogs.com/findumars/p/5929831.html?utm_source=itdadao&utm_medium=referral

https://baike.baidu.com/item/内存泄漏/6181425?fromtitle=内存泄露&fromid=305116&fr=aladdin

你可能感兴趣的:(C++基础)