这两种方法试图在需要时动态扩展数组。
方法1。
int size = 10;
int count = 0;
int number;
int* intlist = new int[size];
in >> number;
while (!in.fail())
{
if (count == size)
{
size *= 2;
int* temp = new int[size];
for (int i = 0; i < count; i++)
{
temp[i] = intlist[i];
}
delete[] intlist;
intlist = temp;
}
intlist[count] = number;
count++;
in >> number;
}
方法2
int size = 10;
int count = 0;
int number;
int* intlist = new int[size];
in >> number;
while(!cin.fail())
{
if ( count == size )
{
int* temp = intlist;
intlist = new int[size*2];
for ( int i=0;i<size; i++)
intlist[i] = temp[i];
delete [] temp;
size = size * 2;
temp = NULL;
}
intlist[count] = number;
count++;
in >> number;
}
方法1完成后,数组temp会发生什么?是否有必要释放temp
的记忆?
我尝试delete[] temp;
并将其指向NULL
,但它搞砸了我的intlist
。
答案 0 :(得分:4)
您的第一个示例使用temp
来保存新创建的数组,而第二个代码使用它来保留对原始数组的引用。
“方法1完成后,数组temp会发生什么?”
intlist
将进一步引用它。
在第一种情况下,你不能delete [] temp;
,因为它会让你没有任何有效的分配。
在第二种情况下,intlist
指针移动到temp
,然后重新分配另一个分配。 temp
用于深层复制内容,完成后将被删除。
无论如何,你应该注意(如评论中所述),除了学术上的研究和学习理由之外,应该使用 std::vector<int> intlist;
来解决这些问题。