2009-12-04 3 views
1

Je regarde cela, où m_Rows est un CAtlList:CAtlList :: RemoveAt invalide-t-il des POSITIONS existantes?

void CData::RemoveAll() 
{ 
    size_t cItems = m_Rows.GetCount(); 
    POSITION Pos = m_Rows.GetHeadPosition(); 

    while(Pos != 0) 
    { 
     CItem* pItem = m_Rows.GetAt(Pos); 

     if (pItem != 0) 
      delete pItem; 

     POSITION RemoveablePos = Pos; 
     pItem = m_Rows.GetNext(Pos); 

     m_Rows.RemoveAt(RemoveablePos); 
    } 
} 

et je me demande s'il y a un potentiel que l'appel RemoveAt peut invalider Pos?

Répondre

1

Selon le documentation, CAtlList se comporte comme une double liste liée, de sorte que la suppression d'un élément de liste devrait pas invalider les pointeurs vers d'autres éléments. Le type POSITION référence directement l'emplacement de mémoire d'un élément de liste:

La plupart des méthodes CAtlList utilisent une valeur de position. Cette valeur est utilisée par les méthodes pour référencer l'emplacement de mémoire réel où les éléments sont stockés et ne doit pas être calculée ou prédite directement.

Il semble que ce n'est pas le cas 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); 
} 
+0

Merci pour trouver cela. Je ne suis pas sûr que cette déclaration dans la documentation réponde réellement à ma question. Je veux dire, il est possible que lorsqu'un RemoveAt est effectué, d'autres éléments peuvent être déplacés en mémoire par l'opération. Je suppose que d'autres éléments ne sont pas déplacés, mais je voulais être sûr que ce code est correct. –

+0

C'est un point valide. Je n'ai pas senti que la documentation était très précise non plus. Je pense que l'extrait de code le règle bien :-) – Sebastian

Questions connexes