2011-01-21 6 views
2

私は、メモリリークを検出するためのVisual Leak Detectorを使用しています、とのようなラインでメモリリークの多くの事例が発生している:std :: map operator []は基本的なデータ型でどのようにメモリリークを引き起こしますか?

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 
    } 
} 

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

何か他の理由でプログラムがクラッシュするという副作用であるのはメモリリークでしょうか?プログラムがクラッシュまたは終了すると(1)マップが完全に破壊されませんか?

答えて

8

あなたはここに掲載したコードは完全に罰金であり、任意のリークが発生することはありませんので、いくつかの可能な原因があります。

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

あなたとピーターの答えは組み合わされるべきです。 – Omnifarious

+0

exit(1)コマンドはこのような異常終了を引き起こしますか? – Jonathan

+1

@ Jonathan-仕様のセクション18.3.8によると、 "自動オブジェクトは' exit() 'を呼び出した結果破壊されません。そう、はい、 'exit'を呼び出すと、デストラクタが実行されなくなります。 – templatetypedef

4

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

マップに挿入するときは、ツリー内に新しいノードを作成する必要があります(マップは通常red-black treeです)。通常、マップはすべての挿入に動的メモリを割り当てますが、これはプリミティブ型、ユーザー定義型またはポインタでは変わりません。