关于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的成员变量
小弟不明,请大家指点迷津!
------解决方案--------------------
这个是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; } }