void CCad2vctDlg::ReadDxfLWPolyline(FILE *pFile)
{
    char str1[500];
    LineData *pCurLineData,*pPrevLineData;
    while(! feof(pFile) && ! ferror(pFile))
    {
        fscanf(pFile,"%s\n",str1);
        if(strcmp(str1,"LWPOLYLINE")==0)
        //if(strnicmp("LWPOLYLINE",str1,10)!=0)
        {
            
            pCurLineData=new LineData[sizeof(LineData)];
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",pCurLineData->AimCode);            pCurLineData->FeatureCode="C20";
            pCurLineData->LineMark=1;            fscanf(pFile,"%s\n",str1);
            if(strcmp(str1,"102")==0)
            //if(strnicmp("102",str1,3)!=0)
            {
                fscanf(pFile,"%s\n",str1);
                fscanf(pFile,"%s\n",str1);    
                fscanf(pFile,"%s\n",str1);
                fscanf(pFile,"%s\n",str1);
                
            }            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",pCurLineData->LayerName );            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
                        fscanf(pFile,"%s\n",str1);
            //fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%d\n",&pCurLineData->PointNum);            Point *LnPnt;
            LnPnt=new Point[pCurLineData->PointNum];
            pCurLineData->pMemberPoint=LnPnt;            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);
            fscanf(pFile,"%s\n",str1);            for(int i=0;i<pCurLineData->PointNum;i++)
            {                fscanf(pFile,"%s\n",str1);
                fscanf(pFile,"%f\n",&LnPnt[i].X);
                fscanf(pFile,"%s\n",str1);
                fscanf(pFile,"%f\n",&LnPnt[i].Y);
            }
            pCurLineData->pNext=NULL;
            if(LineFlag==0)
                pHeadLineData=pCurLineData;
            else
                pPrevLineData->pNext=pCurLineData;
            
            LineFlag=1;
            pPrevLineData=pCurLineData;
            delete pCurLineData;            pCurLineData=NULL;
            
        }
            
    }
    
    delete pPrevLineData;
    pPrevLineData=NULL;
}
 

解决方案 »

  1.   

    太长了,不想看
    是不是new完了没有delete
      

  2.   

    try
    {...........};
    catch(CMemoryException,e)
    {.............};
      

  3.   

    new一个数组后,这样释放delete [] a;(a为数组名)。别忘了加[].!
      

  4.   

    现在知道你哪儿错了吧,你也知道你程序消耗了多少内存:有个while循环,分配数组,却每次没有释放干净!!
      

  5.   

    delete [] pCurLineData;
    delete [] pPrevLineData;
      

  6.   

    还是不行
    delete [] LnPnt;
    是这样写吗?
    放在什么位置?
      

  7.   

    还有一个方法..用boundschecker啦....很容易就找出内存泄漏错误了...在vckbase里有下..
      

  8.   

    我改用CList还是不行呀
    struct LineDataItem
    {
    CString AimCode;
    CString FeatureCode;
    CString LayerName;
    int LineMark;
    int PointNum;
    int ChildNum;
    int* pMemberChild;
        Point* pMemberPoint;

    };
    class CLineData  
    {
    public:
    CLineData();
    virtual ~CLineData();
    CList<LineDataItem,LineDataItem>  LineDataList;};void CCad2vctDlg::ReadDxfLWPolylineList(FILE *pFile)
    {
    char str1[500];
    LineDataItem *pCurLineData;
    while(! feof(pFile) && ! ferror(pFile))
    {
    fscanf(pFile,"%s\n",str1);
    if(strcmp(str1,"LWPOLYLINE")==0)
    //if(strnicmp("LWPOLYLINE",str1,10)!=0)
    {

    pCurLineData=new LineDataItem[sizeof(LineData)];
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",pCurLineData->AimCode); pCurLineData->FeatureCode="C20";
    pCurLineData->LineMark=1; fscanf(pFile,"%s\n",str1);
        if(strcmp(str1,"102")==0)
    //if(strnicmp("102",str1,3)!=0)
    {
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);

    } fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);

    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",pCurLineData->LayerName ); fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    //fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%d\n",&pCurLineData->PointNum); Point *LnPnt;
    LnPnt=new Point[pCurLineData->PointNum];
    pCurLineData->pMemberPoint=LnPnt; fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%s\n",str1); for(int i=0;i<pCurLineData->PointNum;i++)
    { fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%f\n",&LnPnt[i].X);
    fscanf(pFile,"%s\n",str1);
    fscanf(pFile,"%f\n",&LnPnt[i].Y);
    }

    LineList.LineDataList.AddTail(*pCurLineData);

    }

    }
    }
      

  9.   

    pCurLineData=new LineData[sizeof(LineData)];这代表 pCurLineData 是一个数组,每必要 pCurLineData=new LineData;while (pCurLineData->LineDataList.isEmpty)
    {
       LineDataItem* pa  = pCurLineData->LineDataList.RemoveTail();
       delete []pa->pMemberPoint;
       delete []pa;
    }pCurLineData=new LineDataItem[sizeof(LineData)];
    没必要 LineDataItem CurLineData;不是很好吗
      

  10.   

    有NEW 的地方用完马上删除
      

  11.   

    问题找着拉
    少这么一句
    pPrevLineData=new LineData[sizeof(LineData)];