【问题标题】:When allocating a dynamic array, are the previous elements deleted?分配动态数组时,前面的元素是否被删除?
【发布时间】:2014-11-22 11:03:37
【问题描述】:

标题或多或少地说明了一切。当我需要一个(就本例而言)整数数组来存储未知数量的值时,我知道我可以使用new *array = new int[size] 更改它的大小。现在我的问题是:如果我有一个一定大小的数组,但我需要让它更大,我可以只使用 new 运算符来扩展它,它是否仍然具有所有以前存储的元素,或者创建一个更聪明具有动态大小的全新数组,将前一个数组中的所有元素复制到新数组和delete[] 旧数组中。基本上只是在两个数组之间交换,只要我需要一个新的大小。

具体来说,我要问的是这段代码是否会按照预期的方式工作

for(int i = 1; i < 10; i++){
int *array = new int[i];
array[i-1] = i;
}

我的假设是这个数组的大小首先是 1,并将值 1 存储在索引 0。然后它将重新分配其大小为 2,并将值存储到索引 1,依此类推,直到 i 为 9。

我想更好地重新表述我的问题:使用 new 初始化的数组是否必须填充元素,还是会复制它在使用运算符之前的元素?

【问题讨论】:

  • new *array = new int[i]; 看起来很奇怪。不编译的代码不好解释你的意思。
  • 请贴一些真实的代码。
  • 没有。分配第二个更大的数组,复制内容,然后删除 [] 旧数组。是的,对于大型阵列,这可能会变慢。如果您需要更灵活的东西,还有其他数据结构,如列表、树……与数组相比,它们各有优缺点。
  • @deviantfan 修复了一个错字,抱歉

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

您不能以这种方式调整数组的大小。您需要创建一个新数组,然后将旧数组复制到其中。您也可以尝试 std::vector,它会自动执行您想要的操作。

如果你想使用指针而不是 std::vector 来改变你的数组的大小,你可以这样做。

int n = 100; // This will be the number of elements.

int *array1; // Pointer

array1 = new int[n]; // This will allocate your array with size n, so you will have 100 elements. You can combine this with the previous in int *array1 = new int[n];

因此,请随意填写此数组... 然后你决定你想要一个 200 个元素的数组吗?您将需要以相同的方式创建一个不同的数组。

int *array2 = new int[200]; 

您可以使用 for 循环将数组 1 复制到数组 2 中。for 循环的迭代次数应与数组 1 中的元素数量一样多 (100)。

for(int i = 0; i < 100; ++i)
    array2[i] = array[1];

在这个阶段,array2 与 array1 完全相同,但有 100 个未初始化的元素可供您使用,从 [100] 到 [199]。

您不再需要 array1,所以在某些时候,您应该调用

delete [] array1;

顺便说一句,您的假设是行不通的,因为在循环的第一个循环中,您创建(或尝试创建)一个 i=1 元素的数组。数组从 0 开始计数,因此您唯一的单个元素是 [0]。当 i 为 0 时,i-1 是什么?

如果您尝试访问数组[-1],您可能会崩溃。但是为什么要创建 10 个不同的数组呢? new 关键字创建一个不相关的对象,而不是覆盖具有相同名称的对象。

【讨论】:

    【解决方案2】:

    使用new 初始化的数组是否必须填充元素,还是会复制使用运算符之前的元素?

    new[] 分配新数组,完全独立于之前的数组。

    我知道“让数组变大”的 3 种方法:

    1. 正如@ravi 所说,不要乱用指针,使用现代的std::vector
    2. 在新指针中创建新数组,std::move 元素从旧数组到新数组,然后 delete[] 旧数组。
    3. 摆脱new[] & delete[],使用旧的reallocmalloc & free

    【讨论】:

      【解决方案3】:

      您必须分配新数组并将旧数组的数据复制到其中。这就是矢量的实现方式。如果有更好的方法,C++ 标准社区会考虑这一点。

      【讨论】:

      • @Puppy 在这种情况下是的,因为容器是 STL 的主干。任何可能的优化都可以证明是巨大的收获。
      猜你喜欢
      • 2018-09-17
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多