Memory leaks 为什么内存泄漏很常见?

Memory leaks 为什么内存泄漏很常见?,memory-leaks,Memory Leaks,这是因为程序员对内存是如何动态分配和释放的基本误解吗?这是因为自满吗?不是。这是因为记录每一次内存分配所需的计算量太大。谁负责分配内存?谁负责释放它?确保使用相同的API分配和释放内存等。。。确保捕获所有可能的程序流,并在所有情况下进行清理(例如,确保捕获错误或异常后进行清理)。列表如下……在一个规模合适的项目中,人们可能会忘记分配的资源 有时,编写一个函数时,需要一个未初始化的数据结构作为输入,然后进行初始化。有人传入一个已经初始化的数据结构,因此先前分配的内存会泄漏 内存泄漏是由基本的误解造

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

不是。这是因为记录每一次内存分配所需的计算量太大。谁负责分配内存?谁负责释放它?确保使用相同的API分配和释放内存等。。。确保捕获所有可能的程序流,并在所有情况下进行清理(例如,确保捕获错误或异常后进行清理)。列表如下……

在一个规模合适的项目中,人们可能会忘记分配的资源

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

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


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

我认为这是由于工作压力,需要死线和高层管理推动项目走出大门。所以你们可以想象,在这样的压力环境下,通过测试、问答、同行代码评审,内存泄漏可能会从网络中溜走

因为您的问题没有提到语言,所以今天有了自动内存管理,它负责内存记帐/跟踪,以确保不会发生内存泄漏,比如Java/.NET,但也有一些会从网络中溜走。C/C++等使用了
malloc
/
新的
函数,由于分配的内存量很大,因此总是很难检查

再次强调,追踪这些漏洞可能很难找到,这又是一个曲线球——它是否在开发人员的机器上工作,但它没有显示出来,但在生产中,内存开始像地狱一样泄漏,是配置、硬件、软件配置还是更糟,内存泄漏可能出现在生产环境中特有的随机情况下,或者是时间/成本限制导致内存泄漏发生,或者是内存分析工具成本过高或缺乏资金来帮助开发团队跟踪泄漏

总而言之,开发团队中的每个人都有自己的责任确保代码正常工作,并且了解有关内存管理的规则(例如,对于每个
malloc
,应该有一个
免费的
,对于每个
新的
应该有一个
删除
),但是,开发团队本身不应受到指责,也不应指责管理层“给开发团队施加压力”

归根结底,仅仅依靠开发团队并将“自满”放在他们的肩上是错误的经济

希望这有帮助, 顺致敬意, 汤姆

  • 虫子

  • 即使没有bug,也不可能提前知道哪个函数应该释放内存。如果代码结构本质上是功能性的(主函数调用子函数,子函数处理数据然后返回结果),那么这就很容易了,但是如果多个踏板(或多个不同的对象)共享一段内存,那么这就很容易了。可以使用智能指针(在C++中),但在其他方面,这或多或少是不可能的

  • 泄漏并不是最糟糕的错误。它们的影响通常只是性能的累积降级(直到内存耗尽),所以它们的优先级并没有那么高


  • 缺少结构化作用域和分配内存的明确所有权。

    就个人而言,我觉得这是40%的无知、40%的粗心和20%的懒惰。+1同上。这就是我想说的一切,还有更多。我只是喜欢那些没有文档记录的API的人递给我,希望我能成为内存分配的预言大师。@John-我对你评论中的重点不屑一顾被认为是幼稚吗?总的来说,编程很难。我一点也不相信这很难。您只需明确了解资源的所有权。当一个函数返回一个动态分配的块给你时,它应该在doco中说你现在拥有了所有权,释放它是你的责任。同样,如果您将所有权传递给另一个函数,则它负责。请注意,您可以向函数传递内存和从函数接收内存,而无需转移所有权,例如“printf(“%s”,dyn_mem);”不传递所有权,但“dyn_mem=strdup(str);”是的。如果问题不难解决,那么不称职的开发人员就是常态。内存泄漏只是bug。作为一名程序员,你身上的压力可能会导致你犯更多的错误(这在我身上发生过),但如果没有任何压力,你仍然会有漏洞。这只是个难题。