您的位置:首页 > 其它

双指针的应用应注意

2010-10-30 22:14 92 查看
//获取原始勘探工程信息
m_pMineProFile 为全局变量
private:
CMineProfile *m_pMineProFile; //剖面信息
long m_lMineProNum; //剖面数目
long CKTEngModelFunc::GetAllEngInfo(bool bIsOri)
{
long i = 0;
if (m_lMineProNum == 0)
{//从数据库读取信息,保存在公有变量m_pMineProFile中
m_pMineMng->GetAllKTXInfos(&m_pMineProFile,&m_lMineProNum);
}

CMineProfile *pMineProFile = NULL;
long lMineProNum = 0;
//再一次读取,数据管理器会把上次读取信息时申请的空间给释放掉,然后再次申请空间,如果新申请的空间是和第一次申请的空间的位置是一样的,公有变量m_pMineProFile的数据依然有效(先被释放,然后又重新指向同一地址空间),后面可以继续操作。但是,如果新申请的空间和第一次申请的空间不一样的话,公有变量m_pMineProFile所指的内存就已经被释放,成为一个野指针,后续操作错误,这种情况主要发生在数据库记录改变,重新申请的内存地址变化造成。
m_pMineMng->GetAllKTXInfos(&pMineProFile,&lMineProNum);
for (i = 0; i< m_lMineProNum; i++)
{
if (0 > GetEngInfoByKtxCode(bIsOri, m_pMineProFile[i].m_szKTXCode,i))
{
continue;
}
}

return 1;
}

//数据管理器中的代码:
{
MINE_SAFE_DELETE_ARRAY(m_pBMDInfo->m_pMineProfile);
if (NULL == (m_pBMDInfo->m_pMineProfile = new CMineProfile[lKtxNum]))
goto EndPro;

memset(m_pBMDInfo->m_pMineProfile,0,lKtxNum*sizeof(CMineProfile));
for(long i=0;i<lKtxNum;i++)
{
m_pBMDInfo->m_pMineProfile[i] = mineProfiles[i];
}

*ppMineProfile = m_pBMDInfo->m_pMineProfile;
}
数据管理器—双指针的示意图:



从图中可以看出,
如果m_pBMDInfo->m_pMineProfile申请的地址发生变化,m_pMineProfile就会发生错误,而且pMineProfile作为公有变量本身就是不正确的,勘探线的存取很频繁,自己第一次取数据后,后面的其他的操作(容老大的操作)可能就会改变pMineProfile的内容,产生错误。
如果外面释放了m_pMineProfile的内容,例如我在
CKTEngModelFunc::~CKTEngModelFunc()
{
SAFE_DELETE_ARRAY(m_pMineProFile);
ClearAllData();
}
这样数据管理器继续操作MINE_SAFE_DELETE_ARRAY(m_pBMDInfo->m_pMineProfile);
的时候就会发生异常,原因是,内存已被我释放了,但是m_pBMDInfo->m_pMineProfile不为空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: