CArray 使用不当会产生内存碎片,应先调用SetSize(),但具体怎么用还不是太清楚,先看代码:
运行结果:
1, 0x2bcf58, 0x2bcf98, 2
2, 0x2b9e78, 0x2b9e78, 2
3, 0x2b9ec0, 0x2b9ec0, 80
从以上结果看出,第一种方法未用SetSize是错的,执行arr1.Add( 2 )时会重新给第一项分配内存,内存地址变了(0x2bcf58, 0x2bcf98),第二、三种方法正确,添加元素时,不重新分配内存,内存地址不变。
1.SetSize(INT_PTR nNewSize, INT_PTR nGrowBy)并不预分配内存,在第一次执行Add或InsertAt时分配nGrowBy内存,用完时再分配nGrowBy内存。
2. RemoveAll将销毁已经分配的内存,下次调用Add时再分配。如果频繁清除时请使用RemoveAt,不会重新分配内存。
3.setsize(100,100)之后直接用add就会从101开始存,除非用removeall之后再用add,或者用setat
4.动态实现二维数组
//CArray <int,int&> m_ArrayRecordSpeed1[10];
//for(int i=0;i<10;i++)
//{
// m_ArrayRecordSpeed1[i].SetSize(100,-1);//此句
//}
//for(int i=0;i<10;i++)
//{
// m_ArrayRecordSpeed1[i].RemoveAll();//此句
//}
//for(int i=0;i<10;i++)
//{
// m_ArrayRecordSpeed1[i].Add(i);
//}
//for(int i=0;i<10;i++)
//{
// CString str;
// str.Format(_T("%d"),m_ArrayRecordSpeed1[i].GetAt(0));
// MessageBox(str);
//}