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. |