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