2009-12-04 43 views
1

我期待在此,其中m_Rows是CAtlList:CAtlList :: RemoveAt是否使現有的位置失效?

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); 
    } 
} 

,我想知道,如果有可能的是,RemoveAt移除呼叫可能會使名次?

回答

1

根據documentation,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); 
} 
+0

感謝發現。我不確定文檔中的聲明實際上是否回答我的問題。我的意思是,當執行RemoveAt時,可能會通過操作將其他元素移動到內存中。我猜其他元素不會被移動,但是要確保這段代碼是正確的。 – 2009-12-04 15:52:02

+0

這是一個有效的觀點。我不覺得文件也非常精確。我認爲代碼片段解決了它:-) – Sebastian 2009-12-04 16:25:02