我有个CPtrArray 用来保持记录在每次保持在CStringArray里的数据,程序要重复很多次同样的工作,我希望在使用完一次取得的CPtrArray里的数据后清理空它,再继续下一次循环。但现在的问题是Do_OnePrc()里的new CStringArray 不能在子过程里面删除它,否则在程序使用CPtrArray时会出错,但是使用完后想释放它又不成。如果数据量比较小,我可以创建几个全局CStringArray使用后再delete。现在就不知道怎么办好。请教怎么解决这个问题!
全局变量: CPtrArray mTableArray;
void ****::myworkproc()
{
  for(int m=0;m<200;m++)
  {
for (int i=0;i<20000;i++)
{
do_OneProc();
} ...//work with mTableArray int ix = 0;
while (ix < mTableArray.GetSize() )
{
delete (CStringArray *)mTableArray.GetAt( ix++ );
}
mTableArray.RemoveAll(); //can not free the used memory!
  }
}
void ****::do_OneProc()
{
CStringArray *mRowRecords=new CStringArray; for (int j=0;j<500;j++)
{
CString str;
...
str=****;
...
mRowRecords->Add(str);
} mTableArray.Add(mRowRecords); //if delete mRowRecords ,when work with mTableArray will error!
}

解决方案 »

  1.   

    直接声明CStringArray类型的对象,不就不用释放了吗
      

  2.   

    to 楼上
    我试过了,不行,在子过程运行完后、主过程使用CPtrArray的时候会出现和在子过程内部就delete mRowRecords一样的错误,实际上这个时候CPtrArray内部已经没有有用的数据了,子程序退出后CPtrArray所指的内存区域是错误的。因为定义:CObArray::Add 
      int Add( CObject* newElement );
      

  3.   

    int ix = 0;
             CStringArray *mRowRecords
    while (ix < mTableArray.GetSize() )
    {
                  mRowRecords = (CStringArray *)mTableArray.GetAt( ix++ );
                  mRowRecords.RemoveAll();
         delete mRowRecords;
    }
    mTableArray.RemoveAll(); //can not free the used memory!
      

  4.   

    to 楼上和
    int ix = 0;
    while (ix < mTableArray.GetSize() )
    {
    delete (CStringArray *)mTableArray.GetAt( ix++ );
    }
    mTableArray.RemoveAll();一样的,没有作用
      

  5.   

    俺觉得因为CPtrArray里面是个数组 , SO遍历数组来一个个的删除。或者可以试一个
    while (ix < mTableArray.GetSize() )
    {
    delete [](CStringArray *)mTableArray.GetAt( ix++ );
    }
      

  6.   

    to 楼上
    你的思想和 huanyun(无妻徒刑) 的一样,结果也一样没有变化,而且这种方法还会报错的,它是个数组,但不是这样free memory的。
      

  7.   

    试试这么删除
    while(mTableArray.GetSize()>0)
    {
      delete (CStringArray *)mTableArray.GetAt(0);
      mTableArray.RemoveAt(0);
    }
      

  8.   

    to 楼上一点都不慢啊,我是处理文件,3MB的文件一秒就处理完了,要不停处理几GB的文件,如果每次内存释放干净的话不消耗内存啊。
      

  9.   

    to all我感谢大家的启发与关注,我发现我最开始的方法是对的,正如 OnlyHappy(说好不打脸) 所说,不存在错误,我仔细检查了程序,发现一个子程序内的对象在不采用时没有安全释放(delete mRowRecords),才造成了内存的增加。大家辛苦了,来者有分,散~~~~~