私はカスタムのtextfile-data parser(JSON風)を書いていますが、小さなメモリリークを見つけようと多くの時間を浪費しています。C++:std :: mapを使った小さなメモリリーク
私はVC++ 2008とコマンド_CrtMemCheckpointと_CrtDumpMemoryLeaksを使用してメモリリークをチェックしています。私は「問題を狭めるために管理している
{290} normal block at 0x00486AF0, 16 bytes long.
Data: < H `aH hH eH > C0 9A 48 00 60 61 48 00 18 68 48 00 D8 65 48 00
:私は任意のファイルを解析し、(主張任意の他のメモリと一緒に)メモリから削除する場合
は、私はこのようになります16バイトのメモリリークを取得しますこれまでのコードの「行:
classDefinitions[FastStr(cString)] = classDef;
classDefinitionsはstd::map<FastStr, FSLClassDefinition*>
で、私のパーサクラスのプライベートメンバーです。
FastStrは単純なC文字列をキー値として使用するための単純なchar * "ラッパー"です。メモリリークはありません(新しいコマンドはありません)。 'FSLClassDefinition *'は明らかに単純なクラスポインタなので、そこには何も変わっていません。
今ここでキャッチです:
- この行は、構文解析処理中に何度も実行されますが、私は1つの16バイトのブロックがリークします。
- 別のファイルを解析すると、別の16バイトのメモリリークはありません
- ({}コードブロック内にある)パーサーをメモリから削除した場合は、別のコードブロックで再作成し、別のファイルを解析すると、が返されます。 16MBのメモリリークが発生します。
これは私には、std :: mapにメモリリークがあると思われます。しかし、それは私の間違いかもしれません...私はそれがの前に、それがの前に解析を停止するので、それが違反行だと確信しています。そこにがのメモリリークの場合は、この行の後にの後に解析を停止すると、ちょうどになります。
誰でもコメントできますか?
有名な最後の言葉:FastStr:「メモリリークはありません」 –
std :: mapにメモリリークがあるとは思えません(テストされていない一部の曖昧なベンダーのSTLバージョンを使用している場合を除きます)。何百万人ものC++ユーザー)。 –
ヨーク:あなたのコメントは本当に私の一日を作りました:-)しかし、真実は、結局、メモリリークはありませんでした。 –