2012-03-01 40 views
0

私は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(); 

私はこれがマイクロソフトであると思いますバグ。それが本当の場合、「インデックステーブル」の作成に使用できるデータ構造と、それを適切に使用する方法は何ですか?

このメモリリークについてのアイデアやコメントはありますか?

要するに

答えて

0

、私のコードのようなメモリリークがあります(私は例としてCListのを使用)を

CList<T>* pList = new CList<T>(); 
pList.AddTail(...); 

私はdelete pList;に忘れてしまった場合は、もちろん私は、メモリリークを持っています、(plex.cppとして報告29)

ポイントは次のとおりです。私はマクロを追加しませんでした:私はた.cppファイルに追加した場合

#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 

、これらのメモリリークは、正しいファイル名と行番号で報告されます。

このマクロを追加しなかったため、#define new DEBUG_NEWが定義された最初の.CPPファイルがメモリリークの報告を行います。
これは、plex.cppがデバッグメッセージで発生した理由です。

関連する問題