这两种动态扩展数组的方法有什么区别?

时间:2015-04-09 19:04:57

标签: c++ arrays pointers dynamic

这两种方法试图在需要时动态扩展数组。

方法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

1 个答案:

答案 0 :(得分:4)

您的第一个示例使用temp来保存新创建的数组,而第二个代码使用它来保留对原始数组的引用。

  

“方法1完成后,数组temp会发生什么?”

intlist将进一步引用它。

在第一种情况下,你不能delete [] temp;,因为它会让你没有任何有效的分配。


在第二种情况下,intlist指针移动到temp,然后重新分配另一个分配。 temp用于深层复制内容,完成后将被删除。


无论如何,你应该注意(如评论中所述),除了学术上的研究和学习理由之外,应该使用 std::vector<int> intlist; 来解决这些问题。