Согласно документации , CAtlList ведет себя как двойной связанный список, поэтому удаление одного элемента списка должно сделать недействительными указатели на другие элементы. Тип POSITION
напрямую ссылается на ячейку памяти элемента списка:
Большинство методов CAtlList используют значение позиции. Это значение используется методами для ссылки на фактическую область памяти, где хранятся элементы, и не должно рассчитываться или прогнозироваться напрямую.
Похоже, что это не так в atlcoll.h:
template< typename E, class ETraits >
void CAtlList< E, ETraits >::RemoveAt( POSITION pos )
{
ATLASSERT_VALID(this);
ATLENSURE( pos != NULL );
CNode* pOldNode = (CNode*)pos;
// remove pOldNode from list
if( pOldNode == m_pHead )
{
m_pHead = pOldNode->m_pNext;
}
else
{
ATLASSERT( AtlIsValidAddress( pOldNode->m_pPrev, sizeof(CNode) ));
pOldNode->m_pPrev->m_pNext = pOldNode->m_pNext;
}
if( pOldNode == m_pTail )
{
m_pTail = pOldNode->m_pPrev;
}
else
{
ATLASSERT( AtlIsValidAddress( pOldNode->m_pNext, sizeof(CNode) ));
pOldNode->m_pNext->m_pPrev = pOldNode->m_pPrev;
}
FreeNode( pOldNode );
}