私はVS2008を使用していました。MFCのメモリリークCMap SetAt
私はこれまでにメモリリークコードを書いてから長いことです:)。 CMAP :: SetAtが呼び出されたときに "pAssoc = NewAssoc()"が呼び出されたときに、MFC "CPlex :: Create"が呼び出されます。メモリを割り当てるために呼び出されます。
私は、単に "RemoveAll()"を呼び出すだけでコンテナを解放することを理解しています、それぞれのエントリを反復し、それぞれを削除する必要があります。
しかし、この場合、私が望むのは、CMapを使ってペアを格納するだけで、CMapに保存されている値ポインタを削除したくないということです。 (他のコンテナはそれを処理します。)
注:このメモリリークはまた、「CMapStringToPtr」で起こった(他の開発者によって報告され、それらをGoogleで検索、確認するためにテストされていない)
01 typedef CMap <int, int, CNode*, CNode*&> CNodeIndexMap;
02 CNodeIndexMap m_mapIndexToNode;
03 CNode* pNode = ... //This pNode is from another container, which is responsible for the nodes' clean
04 m_mapIndexToNode.SetAt(nIndex, pNode);
....
05 m_mapIndexToNode.RemoveAll();
//Clean node list
06 for(int i = 0; i < lstNode.GetCount(); i++)
07 {
08 CNode* pNode = lstNode.GetAt(i);
09 delete pNode;
10 }
11 lstNode.RemoveAll();
私はこれがマイクロソフトであると思いますバグ。それが本当の場合、「インデックステーブル」の作成に使用できるデータ構造と、それを適切に使用する方法は何ですか?
このメモリリークについてのアイデアやコメントはありますか?
要するに