最小的Qt程序会导致内存泄漏

时间:2016-08-06 21:30:43

标签: qt memory-leaks

这是一个几乎最小的Qt程序,它应该释放所有资源,包括内存:

import DS from 'ember-data';
import Ember from 'ember';

export default DS.RESTAdapter.extend({
  host: 'http://127.0.0.1:8080/v1',
  primaryKey: 'uid',
  headers: Ember.computed('session.data.authenticated.currentUser.backendAccessToken', function() {
    return {
      "Auth-Token": this.get("session.data.authenticated.currentUser.backendAccessToken"),
    };
  })
});

但是,#include <QApplication> #include <QMainWindow> #include <memory> int main(int argc, char** argv) { QApplication app(argc, argv); std::unique_ptr<QWidget> wnd{new QWidget()}; wnd->show(); return app.exec(); } 说:

valgrind

我希望得到零&#34;绝对丢失&#34;并且&#34;间接丢失&#34;,但丢失了字节。为什么?我是否错误地解释LEAK SUMMARY: definitely lost: 979 bytes in 24 blocks indirectly lost: 7,858 bytes in 56 blocks possibly lost: 912 bytes in 19 blocks still reachable: 75,719 bytes in 1,080 blocks of which reachable via heuristic: newarray : 832 bytes in 16 blocks suppressed: 0 bytes in 0 blocks Rerun with --leak-check=full to see details of leaked memory 输出,还是应该调用Qt的其他退出函数?

2 个答案:

答案 0 :(得分:2)

错误的假设是&#34;正确/正确/无论你的良好指标是什么&#34;代码不会泄漏任何内存。

有两种泄露的内存:启动或一次性分配不会被重复,以及分配的持续泄漏,可以重复任意且不断增加的次数。后者是可以理解的问题,应该恶毒地进行,直到它们灭亡。

相反,绝对,毫无疑问 - 浪费来释放启动内存。当接下来要发生的事情是流程终止时,每个CPU周期都浪费在它上面,所有内存都以最节能和最节能的方式释放。这些分配不会泄漏。他们在上添加到你的内存调试工具的例外列表中。

在流程终止之前释放每一块内存的文化会对快速连续多次执行的应用程序的能效产生可测量的影响。对于常见的短期流程,例如许多Unix核心实用程序和构建工具(包括编译器),退出之前的free已经浪费了全世界发电厂的许多铁路车载煤,这种趋势表明没有放缓的迹象。

Valgrind是天赐之物。但你不能以崇高的态度对待它的产出,而是提供更好的神性。不要根据Valgrind的输出开发软件,就像它是货物崇拜一样。了解输出的含义,并采取相应的行动。

答案 1 :(得分:0)

问题的更好重新阐述是:&#34; valgrind压制qt错误&#34;。有很多配方,也在stackoverflow上,例如:

Valgind的Qt内存泄漏抑制文件 Suppression files for Qt memory leaks with Valgrind

答案是指来自wxWidgets的这个文件:Valgrind Suppression File Howto https://wiki.wxwidgets.org/Valgrind_Suppression_File_Howto