公共场所|内存泄漏会给你带来多大的麻烦?

文章图片

文章图片
其实有很多人对内存泄漏这个问题并不了解 , 就简单说下它的含义吧:内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况 。 内存泄漏并非指内存在物理上的消失 , 而是应用程序分配某段内存后 , 由于设计错误 , 失去了对该段内存的控制 , 因而造成了内存的浪费 。
也许可能大家还不是很懂 , 那我白话点说吧:假设您经营一家旅馆 。 您可以在白板上保留房间列表 , 当人们过来时 , 您会在房间上写下他们的名字 , 而当他们离开时 , 您会擦掉他们的名字 。 除非偶尔结账时您不擦掉他们的名字 , 但是久而久之 。 您将在容量不足的情况下运行 。 您可能会误认为所有房间已被占用 , 因此将人们拒之门外 。 如果此错误再次发生 , 您最终将使酒店破产 , 因为您认为所有房间都已被占用 , 但实际上几乎是空的!
内存是任何计算机上的有限资源 。 其中可能有很多:例如4 GB(4 GB)或43亿字节 。 对于大多数用户来说 , 这是足够的工作空间 , 但是可能会用完 , 并且发生这种情况很不好 。 尽管可以编写程序来优雅地处理内存不足的情况(但是这可能意味着它们得终止了) , 但许多程序却没有 。 这样做需要在每次分配内存时检查NULL(失败) 。
程序往往在较低程度上依赖于两个C函数的(变体):malloc 和free 。 (具有垃圾收集功能的高级语言程序往往会自动对其进行管理 , 因为即使对于有经验的程序员而言 , 也很难做到这一点 。 )第一个是malloc , 为程序提供了一块内存 , 可以根据需要使用 。 第二个免费版本 , 用于删除该程序对其的声明 。 除非它需要在程序的整个生命周期中都有效 , 否则需要释放所有已分配(或分配)的内容 。 换句话说 , 我们希望程序在执行后自行清理 。 他们可以使用内存 , 但完成后会“放回内存” 。 (但是您可能不想释放已经释放的块 。 这可能会破坏用于管理内存的数据结构 , 这些数据结构通常针对性能进行了优化 。 )在大多数情况下 , 这样做相对容易 。 但是在某些情况下 , 这要困难得多 , 尤其是当对象从一个函数传递到另一个函数或涉及并发操作时 。 您必须跟踪硬件上实际上不存在的“所有权”概念:这可能像是一种契约 。
某些功能和程序无法完全自行清理 。 它们退出后 , 内存仍已分配并保留 , 但从未释放过 , 如果指针丢失 , 也永远不会释放 。 (存在垃圾收集来解决该问题;它释放了不再需要的内存 。 )这不会导致它们马上失败 。 泄漏的子例程似乎没有错误 , 其副作用是无法从其行为中检测到的 。 但是 , 我们倾向于使用计算机进行重复操作:这就是他们的专长 。 通常 , 我们会要求计算机执行一百万次相同的操作 。 现在 , 每次运行都会泄漏4 KB内存的函数或子例程(如果在运行过程中运行一百万次)将消耗4 GB 。 一旦可用内存用完 , 就会发生不良行为 。 另一方面 , 如果根本没有检查内存不足的情况 , 而您尝试取消引用空指针 , 则会得到未定义的行为(通常是段错误) 。 这很讨厌 , 因为导致崩溃的失败与错误本身无关 。
内存泄漏很容易发现和调试 , 因为它们是合成的失败 , 这意味着我们通常希望破坏程序或工件并隔离错误即便可能会使我们失败 。 如果我们想在程序A表面上起作用而且程序B表面上也起作用 , 则A和B的组合也将是一个工作程序 。 但是资源泄漏违反了此规定 , 因为您可能有两个“正在运行”的程序或函数 , 当它们一起或连续运行时会失败 。 总之 , 内存泄漏是程序的未记录副作用 , 可能导致难以捕获的组合失败 , 只是通常是在程序生命周期的后期 。
【公共场所|内存泄漏会给你带来多大的麻烦?】这篇文章呢 , 后半段可能会有点生涩难懂 , 但是也只是想提醒大家在后面的学习过程或者工作过程中尽量避免出现这样的情况 。 然后时间不早了 , 各位晚安 。
推荐阅读
- 星舰飞船|美星舰着陆后爆炸分析:甲烷泄漏可能性较大,未触地时尾部已失火
- spacex|外媒解析SpaceX星舰爆炸原因:问题可能出在着陆腿或燃料泄漏
- 福岛县|核泄漏10年后,福岛再次出现“辐射鱼”,放射性物质超标5倍
- 津云|天津泰达医院部分患者转院、相关中小学幼儿园停课、有关公共场所停业……
- 欧洲上空四枚氢弹从天而降,加油机撞上轰炸机,核泄漏再次发生
- |OriginOS新增“内存融合”技术:8GB等效11GB内存
- 石凤刚|万余平米豪宅内存700万现金30公斤金条,北京一村党总支原书记被通报
- 中新经纬|员工泄漏40万条个人信息 道歉的圆通担什么责?可以索赔吗?
- 信用卡|招商银行信用卡被指信息泄漏违规催收 回应称流程合法
- 217M就可以打王者荣耀?手机多年内存不足,终于被治好了
