2016-08-06 8 views
2

を漏らす可能メモリを含むすべてのリソースを解放する必要がありほぼ最小限のQtプログラムは、次のとおりです。私は期待最小限のQtのプログラムがメモリはここ

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 

#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はと言います「間違って失われた」と「間接的に失われた」のためにゼロを得るが、失われたバイトを持っている。どうして? valgrindの出力が間違っていると解釈するのですか、Qtの終了機能を追加する必要がありますか?

+0

あなたはコードが過剰です。正当な理由がない限り、ウィジェット/ 'QObject'をポインタで保持しないでください。 'QWidget'は他のすべてのPIMPL使用Qtオブジェクトと同様に、' void * 'のサイズです。 **値で**保持する。 –

+0

はい、Qtはメモリをリークします。なぜなら、処理を終了するときにCPUサイクルを解放すると、CPUサイクルが浪費するからです。限り、私は懸念している、それはより多くの方法をリークする必要があります:これらの割り当て解除のすべてが無駄です。解放されていない割り当てをValgrindの例外として追加する必要があります。これらは一回限りの割り当てであり、時間とともに累積されません。起動時に発生し、完全に正常です。 –

答えて

2

"正しい/適切/何が良いメトリックであるか"というコードはメモリがリークしないという誤った仮定です。

リークされるメモリには、スタートアップ、またはこれまで繰り返されないワンタイムアロケーション、および任意かつ増加する回数繰り返されるアロケーションによる継続的なリークがあります。後者は明らかに問題を抱えており、彼らが滅びるまで激しく戦わなければならない。

逆に、これは、無駄なことではありません。スタートアップメモリ​​を解放します。非常に次のことが起きると、すべてのメモリがサイクルとエネルギー効率の高い方法で解放されるプロセスが終了すると、CPUサイクルが浪費されます。これらの配分はリークではありません。彼らはにあなたのメモリにデバッグツールの例外リストを追加するです。

プロセスの終了直前にすべての単一ブロックのメモリを解放することは、連続して複数回実行されるアプリケーションのエネルギー効率に測定可能な影響を与えます。多くのUnixコアユーティリティやコンパイラを含むビルドツールなどの一般的な短命プロセスでは、終了する前に世界中の発電所に多くの鉄道車両が浪費されており、この傾向は減速の兆候を示さない。

Valgrindは神託です。しかし、あなたは最高の神格を与えられた崇拝でその出力を扱うことはできません。 Valgrindの出力に基づいて、カーゴカルトのようなソフトウェアを開発しないでください。出力の意味を理解し、それに応じて行動する。

+0

ご意見ありがとうございますが、リークの不足が良いか悪いかという質問は、Qtアプリケーションでゼロリークを取得する方法です。とにかく、あなたのコメントのおかげで、私は質問のより良い定式化を得ました: "valgrindはqtエラーを抑制します"、そしてすぐに答えを得ました。 – olpa

+1

@olpaゼロリークは望ましくありません。Valgrindの報告書では、漏れがゼロになることを望んでいます*。この2つには大きな違いがあります。 –

関連する問題