我正在看这个,其中 m_Rows 是 CAtlList:
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 调用是否有可能使Pos 无效?
根据文档 http://msdn.microsoft.com/en-us/library/7kc8a6xw(VS.80).aspx, CAtlList 的行为类似于双链表,因此删除一个列表项should不使指向其他项目的指针无效。这POSITION
type 直接引用列表项的内存位置:
大多数 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 );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)