Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存泄漏是否正常?_C++_C_Memory Leaks - Fatal编程技术网

C++ 内存泄漏是否正常?

C++ 内存泄漏是否正常?,c++,c,memory-leaks,C++,C,Memory Leaks,如果分配一些内存并一直使用到应用程序的最后一行代码(例如,全局对象的析构函数),该怎么办?只要内存消耗不随时间增长,当应用程序终止时(在Windows、Mac和Linux上),信任操作系统为您释放内存就行了吗?如果内存被持续使用,直到OS被释放,你会认为这是一个真正的内存泄漏吗? 如果第三方图书馆将这种情况强加给你怎么办?会拒绝使用第三方库,不管它有多棒 我只看到一个实际的缺点,那就是这些良性泄漏将以误报的形式出现在内存泄漏检测工具中。理论上不,实际上这取决于 这实际上取决于程序处理的数据量、程

如果分配一些内存并一直使用到应用程序的最后一行代码(例如,全局对象的析构函数),该怎么办?只要内存消耗不随时间增长,当应用程序终止时(在Windows、Mac和Linux上),信任操作系统为您释放内存就行了吗?如果内存被持续使用,直到OS被释放,你会认为这是一个真正的内存泄漏吗? 如果第三方图书馆将这种情况强加给你怎么办?会拒绝使用第三方库,不管它有多棒

我只看到一个实际的缺点,那就是这些良性泄漏将以误报的形式出现在内存泄漏检测工具中。

理论上不,实际上这取决于

这实际上取决于程序处理的数据量、程序运行的频率以及它是否持续运行

如果我有一个快速的程序,读取少量的数据进行计算并退出,一个小的内存泄漏将永远不会被注意到。由于程序运行时间不长,并且只使用少量内存,因此当程序存在时,泄漏将很小并释放

另一方面,如果我有一个程序可以处理数百万条记录并运行很长时间,一个小的内存泄漏可能会在足够的时间内使机器停机


至于有漏洞的第三方库,如果它们导致问题,要么修复库,要么找到更好的替代方案。如果它不引起问题,它真的重要吗?< /P> < P>我不认为它是一个内存泄漏,除非内存量“使用”不断增长。拥有一些未释放的内存,虽然并不理想,但除非所需的内存量不断增长,否则不是什么大问题。

如果是故意的,那就不是泄漏,除非内存量很大,或者可能会增长为内存量很大,否则就不是问题。在程序的生命周期内不清理全局分配是很常见的。如果泄漏发生在服务器或长时间运行的应用程序中,并且随着时间的推移而增加,那么这就是一个问题。

我相信有人会想出一个理由说是,但不会是我。 我不是说不,而是说这不应该是一个肯定/否定的问题。 有很多方法可以管理或控制内存泄漏,许多系统都有这种方法


在离开地球的设备上有美国宇航局的系统计划进行这项工作。系统将每隔一段时间自动重新启动一次,这样内存泄漏就不会对整个操作造成致命影响。这只是一个遏制的例子。

我想你已经回答了你自己的问题。最大的缺点是它们如何干扰内存泄漏检测工具,但我认为这个缺点对于某些类型的应用程序来说是一个巨大的缺点

我使用的是传统的服务器应用程序,这些应用程序应该是坚如磐石的,但它们存在漏洞,而且全局应用程序确实阻碍了内存检测工具。这是一件大事


在贾里德·戴蒙德(Jared Diamond)的《崩溃》一书中,作者想知道是谁砍倒了复活节岛上最后一棵树,这棵树是他建造独木舟离开岛所需要的。我想知道许多年前的那一天,当第一个global被添加到我们的代码库时。那是它应该被捕获的一天。

在应用程序运行后清理操作系统在概念上没有什么错

这实际上取决于应用程序及其运行方式。必须注意需要运行数周的应用程序中不断发生的泄漏,但是一个计算结果而不需要太多内存的小工具应该不是问题


许多脚本语言不垃圾收集循环引用是有原因的……对于它们的使用模式,这不是一个实际问题,因此会像浪费内存一样浪费资源。

我看到的问题与所有场景问题一样:当程序更改时会发生什么,突然之间,这个小小的内存泄漏被调用了1000万次,而程序的结尾却在另一个地方,所以这很重要?如果它在库中,那么请向库维护人员记录一个bug,不要在您自己的代码中泄漏。

我会回答否

理论上,如果你留下一堆乱七八糟的东西,操作系统会在你之后清理干净(现在这只是粗鲁的行为,但由于计算机没有感觉,这可能是可以接受的)。但您不能预测程序运行时可能出现的所有情况。因此(除非您能够对某些行为进行正式证明),从专业角度来看,创建内存泄漏是不负责任和草率的


如果第三方组件泄漏内存,这是一个非常强烈的反对使用它的理由,不仅是因为即将发生的影响,而且因为它表明程序员工作马虎,这也可能影响其他指标。现在,在考虑遗留系统时,这是很困难的(考虑web浏览组件:据我所知,它们都会泄漏内存),但这应该是规范。

这是特定于领域的,几乎不值得回答。用你那该死的脑袋

  • 航天飞机操作系统:不,不允许内存泄漏
  • 快速开发概念验证代码:修复所有这些内存泄漏是浪费时间
还有一系列的中间情况


延迟产品发布以修复除最严重的内存泄漏外的所有内存泄漏的机会成本($$)通常会让任何“草率或不专业”的感觉相形见绌。你的老板付钱给你是为了赚钱,而不是为了获得温暖、模糊的感觉。

如果你分配内存并一直使用到程序的最后一行,那就不是漏洞。如果您分配内存并忘记它,即使amo
#define BLK ((size_t)1024)
while(1){
    void * vp = malloc(BLK);
}
int main(){
    void * vp = malloc(LOTS);
    // Go do something useful
    return 0;
}