2

Visual Leak Detectorを使用してメモリ リークを検出していますが、次のような行でメモリ リークの多くのインスタンスに遭遇しました。

class SomeClass
{
    // ...
    std::map<long,long> some_map;

    void func(long a_long, long b_long)
    {
        some_map[a_long] = b_long;  // here be a memory leak
    }
}

これはどのように可能ですか?ここにはポインターがなく、オブジェクトのインスタンス化もありません。

他の何かが原因でプログラムがクラッシュしたことの副作用であるメモリリークでしょうか? プログラムがクラッシュしたり exit(1) したりすると、マップがきれいに破棄されなくなりますか?

4

2 に答える 2

8

ここに投稿したコードはまったく問題なく、リークが発生することはありません。そのため、いくつかの原因が考えられます。

  1. 一部の STL 実装では、将来の割り当てを高速化するために、動的に割り当てられたメモリを解放せずに保持するカスタム アロケータを使用します。そのような実装があり、この最適化を使用している可能性があります。これは、メモリ チェッカーの観点からはリークのように見えます。
  2. プログラムが異常終了した場合、mapデストラクタ (またはオブジェクト デストラクタ) は呼び出されず、間違いなくメモリ リークが発生します。
于 2011-01-21T23:44:20.363 に答える
5

メモリ リークはありませんが、インスタンス化があります。

マップに挿入するときは、そのツリーに新しいノードを作成する必要があります (マップは通常、赤黒のツリーです)。通常、マップは挿入ごとに動的メモリを割り当てます。これは、プリミティブ型、ユーザー定義型、またはポインターでも同じです。

于 2011-01-21T23:54:51.623 に答える