扩展阵列容量

时间:2011-03-30 16:33:04

标签: c++ arrays pointers

我正在考虑如何在C ++中快速扩大阵列,我想出了这个:

// set up arr1
int *arr1 = new int[5];

// add data to arr1
arr1[0] = 1;
arr1[1] = 2;
arr1[2] = 3;
arr1[3] = 4;
arr1[4] = 5;

// set up arr2
int *arr2 = new int[10];
arr2 = arr1; // assign arr1 to arr2

// add more values
arr2[5] = 6;
arr2[6] = 7;
arr2[7] = 8;
arr2[8] = 9;
arr2[9] = 10;
这是否安全?我担心这会导致一些奇怪的行为,而且arr2只是一个int [5]数组,你现在正在覆盖不属于它的数据。

7 个答案:

答案 0 :(得分:8)

NO。

arr2 = arr1;

不做你认为的做法!

STL中已有一些内容,称为vector


为了完整起见.. :))

如果您分配的10个项目的数组的开始,则在分配之前

arr2持有地址。在赋值之后,而不是复制内容 arr1所解决的块(我猜你想做的是),该赋值仅改变了arr2所持有的地址到arr1持有的地址(即5项数组的开头),对于其余的代码,这有两个结果:

  1. 您不再拥有您分配的10个项目块的地址,因此您无法释放该块 - 因此您有内存泄漏(如果您的程序继续运行)
  2. 虽然您最初为arr2分配了10个项目,但是通过分配,您现在正在处理一个只有5个项目的块,并且可能访问该块5之外的任何内容(即索引5以后)用一只非常大的板球棒参观鼻腔守护进程 - 或者你可能会幸运...
  3. 那你能做什么:

    1. 使用std::vector<int>,如果它的设计特征就是消除这种负担 来自你(除非你对实施另一个容器感兴趣),如果是这样的话
    2. 使用复制操作正确复制内容,而不是像建议的那样使用std::copy或其他人分配地址,例如memcpy(更喜欢memmove - 它的速度要慢一些但是很好地定义了重叠块等。)

答案 1 :(得分:6)

arr2 = arr1;泄漏内存,并且所有以下arr2[...]=行在访问其边界之外的5个int的数组时会调用未定义的行为。

要执行您想要执行的操作,请将arr2 = arr1;替换为std::copy(arr1, arr1+5, arr2);(示例程序:https://ideone.com/3Rohu

要正确执行此操作,请使用std::vector<int>

答案 2 :(得分:5)

这会泄漏内存,因为您正在分配指针。

int *arr2 = new int[10];
arr2 = arr1; // this does not assign the values

第二个分配使arr2指向数组arr1。您松开了先前分配的阵列,并且永远不能删除它。

要避免这种情况,请使用std::vector

答案 3 :(得分:3)

不,它根本不安全。当你说arr2=arr1;你没有复制任何数据时,你只需重新指定一个指针。现在,您使用int *arr2 = new int[10];分配的内存已被泄露,arr2指向原始的5元素数组,当您开始说arr2[5] = 6;之类的内容时,您正在编写超出该内容的内容阵列和所有地狱可能会破裂。

答案 4 :(得分:2)

实际上是内存泄漏并不安全。你没有用arr2做任何事情,你最后将arr2设置为r1的地址,记得在c和c ++中没有边界检查所以你通过这样做覆盖了另一个堆栈框架

答案 5 :(得分:2)

  

这是否安全?

没有

  

arr2 = arr1; //将arr1分配给arr2

arr2也指向arr1的第一个索引元素。通过这样做,arr2将失去new返回的位置。所以,内存泄漏

使用std :: vector代替展开数组。

答案 6 :(得分:2)

只是添加其他正确的评论。您将泄漏内存的原因是您已使用arr1指针替换了指向arr2的已分配内存的arr2指针。现在arr1,arr2指向同一个东西,5个元素的数组。当您尝试使用delete运算符进行清理时,您只能清理5元素数组,因为已经覆盖了10元素数组的指针。