【问题标题】:Copying content of array to resized array in C++在 C++ 中将数组的内容复制到调整大小的数组
【发布时间】:2013-03-27 11:26:27
【问题描述】:

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

我正在尝试在 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 &lt; 10; i++) items[i] = temp[i]; 并尝试 std::cout 我所有的元素,我最终会丢失前两个元素,但 valgrind 可以正确打印它们。

【问题讨论】:

  • 当这是家庭作业时,更聪明的做法是封装它,即重写你需要的 std::vector 部分......取决于你对“stl”的定义,你也许可以使用 std::copy 之类的东西来封装复制过程。
  • 记住指针是普通变量,因此可以重新赋值...
  • 我接触 C++ 已经有一段时间了,但是,您是否需要将 items[] 复制到 temp[] 然后从 temp[] abck 复制到 items[]?你不能只创建一个指向 items[] 的新指针 - int *temp = items; 然后重新创建项目 - items = new int[10]。从temp 复制到items - 也许看看memcopy 函数或std::copy 函数以最有效地完成此操作。然后删除temp
  • @wmorrison365 int * temp = items; 使我的程序崩溃。
  • @wmorrison365 非常感谢! copy (temp, temp+10, items); 就像一个魅力!

标签: c++ arrays realloc


【解决方案1】:

是的,第一个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;

【讨论】:

  • 奇怪,items = temp; 有一些错误。我不知何故丢失了前两个元素。
  • @NPE 你不是把顺序搞混了吗?最好写下代码而不是描述它
【解决方案2】:

STL 的容器是为了简化这样的工作而设计的。这很乏味,但没有太多选择,当你需要使用C-arrays。

删除

delete [] items; 

是必要的,因为当您放弃对数组的引用时,您可以在中分配新的引用

items = new int [10];

会造成内存泄漏,所以这是必须的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 2012-10-06
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多