2011-03-30 66 views
2

我是用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]数组,现在您正在覆盖不属于它的数据。

+1

你从哪学习C++? – 2011-03-30 16:35:51

+0

只是试验,这里没有书。我正在考虑扩大阵列大小的方法。这显然是一种不道德的做法。 – gregghz 2011-03-30 16:36:53

+3

只需使用std :: vector而不是 – 2011-03-30 16:44:46

回答

6

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

做你想做的事,与std::copy(arr1, arr1+5, arr2);取代arr2 = arr1;什么(例如程序:https://ideone.com/3Rohu

要正确地做到这一点,使用std::vector<int>

+0

最后,有人在谈论STL! :-) +1 – 2011-03-30 16:40:35

+1

@PeterK:或者,实际上,关于C++标准库。 *鸭子* – 2011-03-30 16:45:20

+0

@Tomalak:嘎嘎!显示我的年龄... :-([但无论如何+1!] – 2011-03-30 16:52:08

5

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

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

第二分配使得arr2点到阵列arr1。你松开了先前分配的数组,并且永远不能删除它。

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

8

NO。

arr2 = arr1;

没有做什么你认为它!

STL中已经有了一些东西,叫做vector


为了完整起见.. :)

arr2转让前持有的地址,如果10个项目的阵列的开始你分配。分配后,而不是复制(我猜是你想要做的)的地址块,而不是复制内容,该分配仅仅改变了地址持有的地址arr1持有(即开始5项阵列),为您的代码的其余部分,这会带来两个后果:

  1. 您不再有你分配的10项块的地址,所以你没有释放该块的方式 - 因此你有内存泄漏(如果你的程序继续运行)
  2. 尽管你最初为arr2分配了10个项目,寻址一个只有5个项目的块,并访问5个块之外的任何东西(即,指标5起)很可能在鼻腔守护进程付出了非常大的板球拍参观结束 - 或者你可以得到幸运...

那么,你可以这样做:

  1. 使用std::vector<int>,如果它的设计功能是从你那里取走 (除非你有兴趣实现另一个容器),如果是这种情况
  2. 使用复制操作来正确复制内容而不是分配地址,如建议,使用std::copy或其他,如memcpy(pr efer memmove - 它有点慢,但是对于重叠块等有明确的定义)
+0

我这么认为。这更多的是为了学术目的(复制矢量的行为)。 – gregghz 2011-03-30 16:36:20

+1

继续吧。解释它对于代表点的做法。 – 2011-03-30 16:44:58

+0

@Tomalak,匆匆忙忙,不得不跑回家,做更重要的事情(即和我的儿子一起玩)......反正,现在他已经是一个睡眠......我看到我太迟了。 .. – Nim 2011-03-30 22:29:14

2

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

3

不,它根本不安全。当你说arr2=arr1;你没有复制任何数据时,你只是重新分配了一个指针。现在,您分配的内存int *arr2 = new int[10];已被泄漏,而arr2指向原始的5元素阵列,并且当您开始说出诸如arr2[5] = 6;之类的内容时,您正在写入该数组的末尾,并且所有地狱都可能崩溃。

2

这甚至安全吗?

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

arr2也指向第一个索引元素arr1。并且通过这样做,arr2丢失了它早先指向由new返回的位置。所以,有内存泄漏

改为使用std :: vector来扩展数组。

2

只是添加到其他正确的评论。你泄漏内存的原因是你已经用arr1指针替换了arr2指针,它指向了arr2的分配内存。现在arr1,arr2指向同样的东西,即5个元素的数组。当您尝试使用删除操作符进行清理时,只能清理5元素数组,因为指向10元素数组的指针已被覆盖。