双指针的应用应注意

//获取原始勘探工程信息

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不为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值