【问题标题】:Memory Leak in MFC CMap SetAtMFC CMap SetAt 中的内存泄漏
【发布时间】: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


    【解决方案1】:

    简而言之,我的代码存在内存泄漏,例如:(我以 CList 为例)

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

    如果我忘记delete pList;,当然会出现内存泄漏,报告为plex.cpp(29)

    重点是:我没有添加宏:

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

    如果我将它们添加到 .cpp 文件中,将使用正确的文件名和行号报告这些内存泄漏。

    由于我没有添加这个宏,第一个定义了#define new DEBUG_NEW的.CPP文件负责报告内存泄漏。
    这就是调试消息中出现 plex.cpp 的原因。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2010-10-12
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多