FIX: CMap Template Class Leaks Non-Primitive KEY Objects

ID: Q127194


The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), included with:
    • Microsoft Visual C++, 32-bit Editions, version 2.0


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.

Additional query words: CString CMap 3.00 KEY 2.00

Keywords : kbcode kbnokeyword kbMFC kbVC
Version : 2.00
Platform : NT WINDOWS
Issue type :


Last Reviewed: September 10, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.