new创建对象数组 比较 new单个对象的优点

 使用new可以新建类的单个和多个对象,如下:

class Obj{ Obj(); Obj(int x); ...}void Test(void){ Obj *a=new Obj; Obj *b=new Obj(1); //初值为1 Obj *c=new Obj[100]; //创建100个动态对象 Obj *c=new Obj[100](1); //错误写法 ... delete a; delete b; delete []c; delete c; //错误用法,只能删除c[0],后面99个泄露}  

案例分析:

    1.变量定义

    //界面配置发送数据帧ArrayCArray <CModFrame*,CModFrame*&> m_ModFrm; //通讯线程发送数据帧Array拷贝 CArray <CModFrame*,CModFrame*&> m_ModFrmCopy; //填充m_ModFrm的对象指针CModFrame* m_pModFrameList1; //填充m_ModFrmCopy的对象指针CModFrame* m_pModFrameList2;     

    2.new对象并初始化赋值

     m_pModFrameList1 = new CModFrame[100];m_pModFrameList2 = new CModFrame[100]; //for循环赋值 CModFrame* pM=NULL; int nIdex=0; for(...) { if(nIndex>0 && (nIndex % 100 == 0)) { //当大于100个对象时,重新分配 } //依次取出分配好的指针对象并赋值 pM = (CModFrame*)(m_pModFrameList1+nIndex); pM->.....=....; //CModFrame对象赋值 m_ModFrm.Add(pM);//加到m_ModFrm的Array中 //依次取出分配好的指针对象并拷贝赋值 CModFrame *pM2 = (CModFrame*)(m_pModFrameList2+nIndex); memcpy(pM2,pM,sizeof(CModFrame)); //加到m_ModFrm的Array中 m_ModFrmCopy.Add(pM2);//加到m_ModFrmCopy的Array中 nIndex++; }      

    3.更改界面m_ModFrm发送帧

     //临界区保护通讯线程m_ModFrm重新赋值给m_ModFrmCopy EnterCriticalSection(&pCh->gCriticalFrm); pCh->m_ModFrm.RemoveAll(); int nIndex=0; for(...) { if(nIndex>0 && (nIndex % 100 == 0)) { //重新分配 } pM = (CModFrame*)(pCh->m_pModFrameList1+nIndex); pM->.....=....; //CModFrame对象重新赋值 pCh->m_ModFrm.Add(pM); nIndex++; } pCh->m_bModFrmChanged=TRUE; LeaveCriticalSection(&pCh->gCriticalFrm);    

    4..通讯线程中的m_ModFrmCopy与m_ModFrm的同步

     for(...m_ModFrm) {...} //发送m_ModFrmCopy数据帧 //界面m_ModFrm有改变,则同步 if (pCh->m_bModFrmChanged) { EnterCriticalSection(&pCh->gCriticalFrm); pCh->m_bModFrmChanged=FALSE; pCh->m_ModFrmCopy.RemoveAll(); //旧的m_ModFrmCopy全部移除掉 //将m_ModFrm的对象拷贝到m_ModFrmCopy中 for (nModFrm=0;nModFrm<pCh->m_ModFrm.GetSize();nModFrm++) { pM=pCh->m_ModFrm.GetAt(nModFrm); CModFrame* pM2 = (CModFrame*)(pCh->m_pModFrameList2+nModFrm); memcpy(pM2,pM,sizeof(CModFrame)); pCh->m_ModFrmCopy.Add(pM2); } LeaveCriticalSection(&pCh->gCriticalFrm); }      

    以上是使用new多个类对象进行CArray的填充,优点比较明显:

    1.只在初始化时new一个固定个数的动态对象,分配好了固定的内存空间,下面再更改CArray的数组对象时,直接依次取出赋值即可。当分配的个数不够时,可以按需进行重新分配。new的对象只需在程序结束时delete掉。

    但是如果通过new单个对象,再一个个加进CArray的话:

    CModFrame* pM = new CModFrame;

    pM->...=...;

    m_ModFrm.Add(pM);

    需要不停的new类的对象,当需要更改CArray的数组对象时,也需要一个个的delelte掉(在本案例中需要),并重新new 并添加,重复的new 对象 和delete 对象,很明显这种方法是不可取的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值