【发布时间】:2012-03-01 00:24:51
【问题描述】:
我用的是VS2008。
自从我上次写内存泄漏代码以来已经很长时间了:),直到我遇到了这个。 报告自:\atlmfc\src\mfc\plex.cpp(29):
当调用 CMap::SetAt 时调用 MFC“CPlex::Create”,同时调用“pAssoc = NewAssoc()”来分配内存。
我明白,仅仅调用“RemoveAll()”释放一个容器是不够的,需要迭代每个条目并删除它们。
但在这种情况下,我只想使用 CMap 来存储对,我不希望 CMap 删除它存储的值指针。 (另一个容器负责处理。)
注意:此内存泄漏也发生在“CMapStringToPtr”中(由其他开发人员报告并用谷歌搜索,未经测试确认)
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();
我猜这是一个微软的错误。如果真是这样,我可以用什么数据结构来创建“索引表”,如何正确使用?
对此内存泄漏有何想法或评论?
【问题讨论】:
标签: memory-leaks mfc