FIX: CMap Template Class Leaks Non-Primitive KEY Objects (127194)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++, 32-bit Editions 2.0

This article was previously published under Q127194

SYMPTOMS

When using the CMap template class, users may notice a memory leak when using non-primitive objects as KEY values (for example, CString).

CAUSE

The CMap class does not call the destructor for its KEYs when it does a RemoveAll().

RESOLUTION

Because the CMap class is implemented in AFXTEMPL.H, users can add a single line to the CMap::RemoveAll() member function in this file to correct this problem. The new line is marked with a //NOTE: in the following code:
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
void CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::RemoveAll()
{
    ASSERT_VALID(this);

    if (m_pHashTable != NULL)
    {
        // destroy elements (values and keys)
        for (UINT nHash = 0; nHash < m_nHashTableSize; nHash++)
        {
            CAssoc* pAssoc;
            for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;
              pAssoc = pAssoc->pNext)
            {
                DestructElements(&pAssoc->value, 1);

                //NOTE: Additional call to destruct the keys!
                DestructElements(&pAssoc->key, 1);
            }
        }
    }

    // free hash table
    delete[] m_pHashTable;
    m_pHashTable = NULL;

    m_nCount = 0;
    m_pFreeList = NULL;
    m_pBlocks->FreeDataChain();
    m_pBlocks = NULL;
}
				

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in the Microsoft Foundation Classes version 3.1 included with Microsoft Visual C++, 32-bit Edition, version 2.1.

Modification Type:MajorLast Reviewed:10/24/2003
Keywords:kbbug kbcode kbCollectionClass kbfix kbNoUpdate kbtemplate kbVC200fix KB127194