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: | Major | Last Reviewed: | 10/24/2003 |
---|
Keywords: | kbbug kbcode kbCollectionClass kbfix kbNoUpdate kbtemplate kbVC200fix KB127194 |
---|
|