我正在考虑如何在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]数组,你现在正在覆盖不属于它的数据。
答案 0 :(得分:8)
NO。
arr2 = arr1;
不做你认为的做法!
STL中已有一些内容,称为vector
。
为了完整起见.. :))
如果您分配的10个项目的数组的开始,则在分配之前 arr2
持有地址。在赋值之后,而不是复制内容 arr1
所解决的块(我猜你想做的是),该赋值仅改变了arr2
所持有的地址到arr1
持有的地址(即5项数组的开头),对于其余的代码,这有两个结果:
arr2
分配了10个项目,但是通过分配,您现在正在处理一个只有5个项目的块,并且可能访问该块5之外的任何内容(即索引5以后)用一只非常大的板球棒参观鼻腔守护进程 - 或者你可能会幸运... 那你能做什么:
std::vector<int>
,如果它的设计特征就是消除这种负担
来自你(除非你对实施另一个容器感兴趣),如果是这样的话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元素数组的指针。