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源码)
{
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源码)
INT_PTR nCount要移除几个。m_pData:肯定是指向数据区别的头指针了。
nIndex:从这个开始
+ i:表示每次向后移动一个数据。
CArray 本身只管理自己的内存,至于你在TYPE里面的内存他不会管理,只是简单的调用析构函数,
每个调用~TYPE()进行析构