在分配动态数组时,先前的元素是否已删除?

时间:2014-11-22 11:03:38

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

标题说明或多或少。当我需要(为了这个例子)整数数组用于未知数量的值时,我知道我可以使用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。 / p>

我想更好地重新解释一下我的问题:使用new初始化的数组是否必须填充元素,还是在使用运算符之前复制它所拥有的元素?

3 个答案:

答案 0 :(得分:2)

您无法以这种方式调整阵列大小。您需要创建一个新数组,然后将旧数组复制到其中。您也可以尝试使用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]到[199]可以使用100个未初始化的元素。

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

delete [] array1;

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

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

答案 1 :(得分:1)

  

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

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

我知道3种方法可以使阵列更大&#34;:

  1. 正如@ravi所提到的,不要与老手混乱,使用现代std::vector
  2. 在新指针中创建新数组,将std::move元素从旧数组生成到新数组,然后然后 delete[]旧数组。
  3. 摆脱new[]&amp; delete[] {}使用旧的reallocmalloc&amp; free

答案 2 :(得分:0)

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

相关问题