为什么内存泄漏很常见?

时间:2010-01-27 03:27:49

标签: memory-leaks

是否由于对程序员的内存如何动态分配和解除分配的基本误解?这是因为自满吗?

5 个答案:

答案 0 :(得分:15)

没有。这是由于跟踪每个内存分配所需的大量会计。谁负责分配内存?谁负责解放它?确保使用相同的API来分配和释放内存等...确保捕获每个可能的程序流并在每种情况下清理(例如,确保在捕获错误或异常后清理)。名单继续......

答案 1 :(得分:3)

在一个体面的项目中,人们可能会忘记分配的资源。

有时会编写一个函数,期望将未初始化的数据结构作为输入,然后进行初始化。有人传入已经初始化的数据结构,因此先前分配的内存被泄露。

内存泄漏是由基本的误解导致的,每个错误都是相同的。我很震惊地发现每次第一次都有人写无bug代码。内存泄漏恰好是一种很少会导致崩溃或显式错误行为的错误(当然,除了使用太多内存之外),因此除非明确测试内存泄漏,否则开发人员可能永远不会知道它们存在。鉴于代码库中的更改总是会增加错误,并且内存泄漏实际上是不可见的,随着程序的老化和扩展,内存泄漏会扩大。

即使在具有自动内存管理的语言中,由于循环引用,内存也可能会泄露,具体取决于所使用的垃圾收集算法。

答案 2 :(得分:2)

我认为这是由于工作压力需要死机和高层管理人员推动项目将其推出门。所以你可以想象,在这样的压力环境中,通过测试,q& a,同行代码评审,内存泄漏可能会漏网。

由于你的问题没有提到语言,今天,有自动内存管理负责内存记帐/跟踪,以确保不会发生内存泄漏,想想Java / .NET,但有一些可以通过网络。由于分配了大量的内存,因此使用malloc / new函数的C / C ++就好了,并且总是更难检查。

然后,追踪那些泄漏可能很难找到哪个是另一个曲线球到这个答案 - 它是否在dev的机器上运行它没有显示,但是在生产中,内存开始泄漏像地狱,是配置,硬件,软件配置,或者更糟糕的是,内存泄漏可能出现在生产环境中独有的随机情况,或者是允许内存泄漏发生的时间/成本约束或是内存分析工具成本过高或缺乏资金来帮助开发团队追踪漏洞......

总而言之,开发团队中的每个人和每个人都有自己的责任来确保代码正常工作,并且 了解有关内存管理的规则 (例如, ,例如对于每个malloc应该有一个free,对于每个new应该有一个delete ),但不应该指责对于开发团队而言,他们也没有指责管理层“为开发团队施加压力”。

在一天结束时,依靠开发团队并将“自满”置于他们的肩上将是错误的经济。

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:1)

  1. 错误。

  2. 即使没有错误,也不可能事先知道哪个函数应该释放内存。如果代码结构本质上是功能性的(主函数调用子函数,然后处理数据然后返回结果),这很容易,但是如果几个踏板(或几个不同的对象)共享一块内存,这并不是微不足道的。可以使用智能指针(在C ++中),但否则它或多或少是不可能的。

  3. 泄漏不是最糟糕的一种。它们的影响通常只是性能的累积降低(直到你的内存耗尽),所以它们不是那么重要。

答案 4 :(得分:1)

缺乏结构化范围并明确分配内存的所有权。