首页 > 其他 > 详细

CArray::SetSize 的用法

时间:2014-03-18 22:34:34      阅读:1204      评论:0      收藏:0      [点我收藏+]

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

CArray::SetSize 的用法

原文:http://blog.csdn.net/hhhh63/article/details/21473991

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!