关于MFC一段源代码和的疑问,指针的申请和释放相关,该怎么解决

关于MFC一段源代码和的疑问,指针的申请和释放相关
这个是MFC的一段源码!
void CWordArray::FreeExtra()
{
ASSERT_VALID(this);

if (m_nSize != m_nMaxSize)
{
// shrink to desired size
#ifdef SIZE_T_MAX
ASSERT(m_nSize <= SIZE_T_MAX/sizeof(WORD)); // no overflow
#endif
WORD* pNewData = NULL;
if (m_nSize != 0)
{
pNewData = (WORD*) new BYTE[m_nSize * sizeof(WORD)];//疑问1: 这个地方用了new,但是后面并没有delete
// copy new data from old 
Checked::memcpy_s(pNewData, m_nSize * sizeof(WORD), 
m_pData, m_nSize * sizeof(WORD));
}

// get rid of old stuff (note: no destructors called) 释放原有的东西 是这么注释的 但是不是很明白
delete[] (BYTE*)m_pData; //疑问2:这个时候为什么要delete m_pData ? 这个只有在析构函数里才释放的
m_pData = pNewData; // 疑问3:delete掉的m_pData 还可以赋值? 这个指针还可以用吗?
m_nMaxSize = m_nSize;
}
}

m_pData(指针变量) ,m _nMaxSize 和m_nSize 是类CWordArray的成员变量
小弟不明,请大家指点迷津!

------解决方案--------------------
C/C++ code
这个是MFC的一段源码! 
void CWordArray::FreeExtra() 
{ 
ASSERT_VALID(this); 

if (m_nSize != m_nMaxSize) 
{ 
// shrink to desired size 
#ifdef SIZE_T_MAX 
ASSERT(m_nSize  <= SIZE_T_MAX/sizeof(WORD)); // no overflow 
#endif 
WORD* pNewData = NULL; 
if (m_nSize != 0) 
{ 
pNewData = (WORD*) new BYTE[m_nSize * sizeof(WORD)];//疑问1: 这个地方用了new,但是后面并没有delete 
//这个段内存的首地址在后面交给pNewData了,通过pNewData释放
// copy new data from old  
Checked::memcpy_s(pNewData, m_nSize * sizeof(WORD),  
m_pData, m_nSize * sizeof(WORD)); 
} 

// get rid of old stuff (note: no destructors called) 释放原有的东西  是这么注释的 但是不是很明白 
delete[] (BYTE*)m_pData; //疑问2:这个时候为什么要delete m_pData ? 这个只有在析构函数里才释放的 
//这是释放以前分配的内存
m_pData = pNewData;      // 疑问3:delete掉的m_pData 还可以赋值?  这个指针还可以用吗? 
//删除掉的是m_pData指向的内存,m_pData本身还存在
//楼主的基础很成问题啊,先找本书充电啊
m_nMaxSize = m_nSize; 
} 
}