CArray 使用不当会产生内存碎片,应先调用SetSize(),MSDN和网友都这么说,但具体怎么用并没有说清楚,先看代码:
// 1. 声明arr1后直接加 CArray<int> arr1; arr1.Add( 1 ); TRACE( "1, 0x%x, ", &arr1[0] ); arr1.Add( 2 ); TRACE( "0x%x, %2i\r\n", &arr1[0], arr1.GetCount() ); // 显示数据元素的地址 // 2. 声明后设置大小 CArray<int> arr2; arr2.SetSize(2); arr2.SetAt( 0, 1 ); TRACE( "2, 0x%x, ", &arr2[0] ); arr2.SetAt( 1, 2 ); TRACE( "0x%x, %2i\r\n", &arr2[0], arr2.GetCount() ); // 显示数据元素的地址 // 3. 声明后设置预留大小 CArray<int> arr3; arr3.SetSize( 0, 80 ); arr3.Add( 1 ); TRACE( "3, 0x%x, ", &arr3[0] ); for( int i = 0; i < 79; i++ ) arr3.Add( 2 ); TRACE( "0x%x, %2i\r\n", &arr3[0], arr3.GetCount() ); // 显示数据元素的地址运行结果:
1, 0x2bcf58, 0x2bcf98, 2 第一种用法是错的,arr1.Add( 2 )时要重新给第一项分配内存
2, 0x2b9e78, 0x2b9e78, 2 第二种方法,正确
3, 0x2b9ec0, 0x2b9ec0, 80 第
从以上结果看出,第一种用法是错的,arr1.Add( 2 )时要重新给第一项分配内存,内存地址变了(0x2bcf58, 0x2bcf98),第二、三种方法,添加元素时,不重新分配内存,内存地址没变。
说明:
void SetSize( INT_PTR nNewSize, INT_PTR nGrowBy = -1 );
nNewSize 分配数组元素,用SetAt方法加元素。
nGrowBy 预留一定空间,GetSize方法取不到这一部分,用Add方法加元素。
总结:
使用数组前先用SetSize分配空间。
如果已知数组大小,用SetSize(50)方法分配内存,再用SetAt方法初始化。
如果不确定数组大小,SetSize(0, 100)方法预留内存,用Add方法初始化,第二个参数可以取大些,保证够用。
CArray::SetSize 的用法,布布扣,bubuko.com
原文:http://blog.csdn.net/hhhh63/article/details/21473991