FIX: CMap Template Class Leaks Non-Primitive KEY ObjectsLast reviewed: September 18, 1997Article ID: Q127194 |
|
2.00
WINDOWS NT
kbprg kbfixlist kbbuglist kbcode
The information in this article applies to:
SYMPTOMSWhen using the CMap template class, users may notice a memory leak when using non-primitive objects as KEY values (for example, CString).
CAUSEThe CMap class does not call the destructor for its KEYs when it does a RemoveAll().
RESOLUTIONBecause 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;
}
STATUSMicrosoft 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 reference words: CString CMap 3.00 KEY 2.00
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |