void CArray<TYPE, ARG_TYPE>::RemoveAt(INT_PTR nIndex, INT_PTR nCount)
{
ASSERT_VALID(this);
ASSERT(nIndex >= 0);
ASSERT(nCount >= 0);
INT_PTR nUpperBound = nIndex + nCount;
ASSERT(nUpperBound <= m_nSize && nUpperBound >= nIndex && nUpperBound >= nCount); if(nIndex < 0 || nCount < 0 || (nUpperBound > m_nSize) || (nUpperBound < nIndex) || (nUpperBound < nCount))
AfxThrowInvalidArgException(); // just remove a range
INT_PTR nMoveCount = m_nSize - (nUpperBound);
for( int i = 0; i < nCount; i++ )
(m_pData + nIndex + i)->~TYPE();
if (nMoveCount)
{
::ATL::Checked::memmove_s(m_pData + nIndex, (size_t)nMoveCount * sizeof(TYPE),
m_pData + nUpperBound, (size_t)nMoveCount * sizeof(TYPE));
}
m_nSize -= nCount;
}黑体的(mfc源码)

解决方案 »

  1.   

    INT_PTR nIndex从哪个开始移除。
    INT_PTR nCount要移除几个。m_pData:肯定是指向数据区别的头指针了。
    nIndex:从这个开始
    + i:表示每次向后移动一个数据。
      

  2.   

    调用TYPE类的析构函数
    CArray 本身只管理自己的内存,至于你在TYPE里面的内存他不会管理,只是简单的调用析构函数,
      

  3.   

    m_pData 是CArray 的成员变量 类型是TYPE, RemoveAt完成删除从nIndex开始的nCount个;(m_pData + nIndex + i)就是从nIndex开始遍历nCount个;
    每个调用~TYPE()进行析构