首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-25 
关于MFC一段源代码和的疑问,指针的申请和释放相关这个是MFC的一段源码!void CWordArray::FreeExtra(){ASSE

关于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; } } 

热点排行