在C ++中将数组的内容复制到调整大小的数组

时间:2013-03-27 11:26:28

标签: c++ arrays realloc

我在这里搜索了很多主题,但他们似乎并没有完全回答我。

我正在尝试用C ++做一些动态重新分配od数组。我不能使用STL库中的任何东西,因为我需要在明确禁止STL(向量,...)的作业中使用它。

到目前为止,我已尝试使用这样的代码进行详细说明:

int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];

delete [] items;   //is this necessary to delete?
items = new int [10];
for (int i = 0; i < 10; i++) items[i] = temp[i];
delete [] temp;

这似乎有效,但困扰我的是过多的迭代次数。难道这不可能更聪明吗?显然,我正在使用比这更大的阵列。不幸的是,我必须使用数组。

编辑:当我尝试items = temp;代替

for (int i = 0; i < 10; i++) items[i] = temp[i];并尝试std::cout我的所有元素,最后输掉前两个元素,但 valgrind 正确打印它们。< / p>

2 个答案:

答案 0 :(得分:5)

是的,第一个delete[]是必要的。没有它,你就会泄露记忆。

关于第一个delete[]之后的代码,所有代码都可以替换为:

items = temp;

这会使items指向您刚刚填充的十元素数组:

int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];
delete [] items;   //delete the original array before overwriting the pointer
items = temp;

最后,当你完成数组时,不要忘记delete[] items;

答案 1 :(得分:0)

STL的容器是为了方便这样的工作而制作的。这很乏味,但是当你需要使用C - 数组时,没有多少选择。

删除

delete [] items; 

是必要的,就像你放弃对数组的引用一样,你可以在

中分配新的引用
items = new int [10];

会导致内存泄漏,所以这是必要的。