2017-01-12 6 views
0

メモリを割り当てるために新しいキーワードを使用する以外に、C++でメモリリークを引き起こす原因は何ですか?私はプロジェクトを持っており、番組中にいくつかのメモリリークがあるようですが、私は新しいキーワードを一度使っていません。私が誤って数時間(4〜6)走ってしまったときも、CPUサイクルをゆっくりと飲み込んでいたのを見て戻ってきました。これがメモリリークの直接的な結果であったかどうかは分かりません私の利用可能なメモリのほとんどすべてを使用していたことを指摘してください)。プログラムを再起動するときには明らかに起こっていませんが、メモリリークがあります。 ありがとう!新しいものを使用する以外にメモリリークを引き起こす原因は何ですか? (C++)

+4

あなた自身が直接 'new'を呼び出すことはできませんが、あなたが他の人から呼び出す関数があるかもしれません。私たちはコードなしで知ることはできません。 –

+1

メモリリークのデバッグでは、Valgrindを使用できます。 – ks1322

答えて

1

それはA

  • など、vectorに追加し、ファイルハンドル、ソケットのようなオープンなリソースを閉め忘れ
  • を削除することはありませんように、

    • アン増え続けるリストのような様々なものかもしれませんあなたが参照カウントされている場合は、サードパーティのライブラリでメモリリークが
    • 循環参照
  • 0

    CPUとメモリを噛むさまざまな方法があります。

    プロファイリングは、CPUを何が使用しているのかを見るのに最適なツールです。いくつかのロギングがある場合は、どこに時間を費やしているのかを知ることができます。

    文字列はメモリ使用の犯人であり、驚くほど頻繁に使用されます。プログラムの開始付近(たとえばXML設定など)で大量のデータを読み込み、スコープ外に出さないようにすると、あなたが明示的にnewに電話しなかったとしても、終了します。ハンドルを開いたままにする。データベース接続、ファイルなどもリソースを消費します。

    参照や他の共有方法を使用しないと、データを簡単にコピーできます。

    あなたが行っていることを測定し、そこから取得する簡単な方法を見つけることを試みてください。

    0
    • mmapようmallocreallocまたはcallocまたはプラットフォーム固有の割り当て関数を使用して返されたポインタを失います。
    • 関数(おそらくコンストラクタ)を使用すると、メモリは割り当てられますが、対応するリリース関数は呼び出されません。たとえば、SDL_Quitを呼び出さずにSDL_Initを呼び出します。
    • 正しく使用してもメモリをリークするサードパーティ製のコードを使用する。
    関連する問題