关于CPtrArray中Add函数使用时的一些坑

一、CPtrArray中的Add函数函数原型为: INT_PTR Add(CObject* newElement);

其中参数newElement为要添加到此数组中的CObject指针。注意!!!坑在这里就要出现了!!!

当我们使用Add(CObject* newElement)函数时,有时会不经意间使用局部变量的地址或成员变量的地址当做Add的输入参数,这时,如果想将该变量值循环放入CPtrArray数组时,可能会出现一个现象,错误的示例代码如下:

	CPtrArray array;
	int jj;
	for (int i = 0; i<11;i++)
	{	
		jj = i;
		array.Add(&jj);
	}
	for(int k = 0; k<array.GetSize();k++)
	{
		cout << *(int*)(array[k])<<endl;
	}

本意是想输出:0,1,2,3,4,5,6,7,8,9,10,但是运行结果如下:

原因是这个变量“jj”的地址在其声明周期结束前一直没变,我们只是改变了jj地址中的内容,由于地址没有改变,因此地址中的内容都是最后一次给jj赋值的内容,即:10。一定要注意这时Add中存放的是变量jj的地址啊!!!

若想输出:0,1,2,3,4,5,6,7,8,9,10有多重办法,第一种是在Add中输入不同地址,即使用new出来的变量,示例代码如下:

CPtrArray array;
	for (int i = 0; i<11;i++)
	{	
		int* jj = new int;
		*jj = i;
		array.Add(jj);
	}
	for(int k = 0; k<array.GetSize();k++)
	{
		cout << *(int*)(array[k])<<endl;
	}

运行结果如下:

 

由于每次new出来的变量都会分配新地址,因此Add中存放的是不同地址下的jj,所以这里可以输出想要的结果。

另一种方式是使用数组的形式,规定到底还是使用不同的地址,示例代码如下:

CPtrArray array;
	int jj[11];
	for (int i = 0; i<11;i++)
	{	
		jj[i] = i;
		array.Add(&jj[i]);
	}
	for(int k = 0; k<array.GetSize();k++)
	{
		cout << *(int*)(array[k])<<endl;
	}

 输出结果:

以上就是我在使用CPtrArray时踩过的坑,希望大家也引以为戒,使用函数之前先仔细思考下该函数应该如何使用,避免也掉入跟我一样的坑,以上内容根据个人理解所述,如有不对的地方,请大家批评指正~ 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值