我有个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!
}
全局变量: 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!
}
我试过了,不行,在子过程运行完后、主过程使用CPtrArray的时候会出现和在子过程内部就delete mRowRecords一样的错误,实际上这个时候CPtrArray内部已经没有有用的数据了,子程序退出后CPtrArray所指的内存区域是错误的。因为定义:CObArray::Add
int Add( CObject* newElement );
CStringArray *mRowRecords
while (ix < mTableArray.GetSize() )
{
mRowRecords = (CStringArray *)mTableArray.GetAt( ix++ );
mRowRecords.RemoveAll();
delete mRowRecords;
}
mTableArray.RemoveAll(); //can not free the used memory!
int ix = 0;
while (ix < mTableArray.GetSize() )
{
delete (CStringArray *)mTableArray.GetAt( ix++ );
}
mTableArray.RemoveAll();一样的,没有作用
while (ix < mTableArray.GetSize() )
{
delete [](CStringArray *)mTableArray.GetAt( ix++ );
}
你的思想和 huanyun(无妻徒刑) 的一样,结果也一样没有变化,而且这种方法还会报错的,它是个数组,但不是这样free memory的。
while(mTableArray.GetSize()>0)
{
delete (CStringArray *)mTableArray.GetAt(0);
mTableArray.RemoveAt(0);
}