Утечка памяти в MFC CMap SetAt - PullRequest
0 голосов
/ 01 марта 2012

Я использовал VS2008.

Уже давно я не писал код утечки памяти :), пока не встретил этот код.сообщается из: \ atlmfc \ src \ mfc \ plex.cpp (29):

MFC "CPlex :: Create" вызывается при вызове CMap :: SetAt, а "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();

Я предполагаюэто ошибка Microsoft.Если это действительно так, то какую структуру данных я могу использовать для создания «индексной таблицы» и как правильно ее использовать?

Есть идеи или комментарии по поводу этой утечки памяти?

1 Ответ

0 голосов
/ 19 марта 2012

Короче говоря, мой код имеет утечку памяти, например: (я использовал 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, об этих утечках памяти будет сообщено с правильным именем файла и номером строки.

Поскольку я не добавил этот макрос, первый файл .CPP, для которого определено #define new DEBUG_NEW, отвечает за сообщение об утечке памяти.
Вот почему plex.cpp встречается в сообщениях отладки.

...