我正在坐毕业设计,坐一个电路分析程序:先画出电路图,然后对其进行分析,
但是在调试的时候,问题是这样子的,当我画一个电阻在电路图上,最大化就出错,我在2000及XP下调试提示有一个什么内存不能读写,在98下没问题。可能因为当放置一个电阻是,我用new 生成了一个对象,我用NuMega BoundsChecker检查提示有内存泄漏,
case IDT_RES:
m_bDrawing=true;
if(m_bIsHor)
m_usrCurrentObject=new CDrawRes(m_nCurrentColor);
else 
{
m_usrCurrentObject=new CDrawRes(m_nCurrentColor,false);
m_bIsHor=true;
}
m_nMoveMode=m_usrCurrentObject->NewPoint  (point.x,point.y);
m_usrCurrentObject->Draw(pDC);
pDoc->SetModifiedFlag();  // 标记文档内容已经被改变,提示用户在关闭时保存
break;
就是上面的那句new 有问题。
请问该怎么解决啊?

解决方案 »

  1.   

    你的CDrawRes是什么函数?返回类型是什么?为什么要用new? 去掉了有没有试试。
      

  2.   

    内存泄漏是由于没有delete你new出来的对象造成的,不是单独的new造成的,你应该看看你的new出来的对象是不是都delete掉了才对.
      

  3.   

    同意RomanticProgrammer,new是没有问题的,我也用过BoundsChecker,它是指你没有delete对像以放掉内存
      

  4.   

    是这样子的,因为有很多种元件,所以定义了一个父类,然后从他派生了很多子类,如CDrawRes(电阻),CDrawIndu(电容),CDrawVSource(电压源),当选中一个元件时,用鼠标左键单击即可,所以new出来一个,以便于序列化(Serialize),我在文档类中定义了一CTypedPtrArray<CObArray,CDrawObject*> m_aObjects;用来存放,
    但是我不知道该在那儿delete掉啊?而且调试时错误在
    void CDemoDoc::DrawObjects(CDC* pDC)
    {
    int i=m_aObjects.GetSize();
    int j;
    for(j=0;j<i;j++)
    {
    CDrawObject* pObject=m_aObjects[j];
    pObject->Draw(pDC);//错误在此
    if(pObject->m_bSelected)
    {//以前已经选择了,设置热点
    pObject->HotPoints(pDC);
    }
    }
    }
    其中的Draw函数为一个虚函数,如电感类的为:
    void CDrawIndu::DrawIndu(CDC* pDC)
    {
    pDC->Arc(m_x+9,m_y-7,m_x+19,m_y+3,m_x+19,m_y+3,m_x+9,m_y+3);
        pDC->Arc(m_x+17,m_y-7,m_x+27,m_y+3,m_x+27,m_y+3,m_x+17,m_y+3);
        pDC->Arc(m_x+25,m_y-7,m_x+35,m_y+3,m_x+35,m_y+3,m_x+25,m_y+3);

        pDC->MoveTo(m_x+8,m_y);
        pDC->LineTo(m_x,m_y);     pDC->MoveTo(m_x+35,m_y);
        pDC->LineTo(m_x+43,m_y);
    }
      

  5.   

    注意不要轻易用new,new的对象要delete掉才能避免内存泄漏,但是有时又不能delete,因为以后可能要用到new的内容,关于new的注意事项在实际应用时就会遇到很麻烦,一两句说不清楚的。
      

  6.   

    你是把NEW出来的对象放到了一个串列中, 那么在程序的最后,你要依次释放这个串列中所有的对象
    , 因为你的串列中的对象都是同一个父类, 所以请将父类的析构函数设虚拟