【问题标题】:Better method to increase the size of an array in C++ dynamically在 C++ 中动态增加数组大小的更好方法
【发布时间】:2013-01-04 20:27:31
【问题描述】:

假设我有一个用 new 分配的字符数组。现在,如果我想修改数组的大小,那么以下两种方法中哪一种是最好的方法? 1.使用realloc函数OR 2.分配一个新数组,将旧数组中的数据复制到新数组中,然后删除旧数组。

【问题讨论】:

  • 都不行,使用std::string
  • 如果您使用new 分配了一个数组(顺便说一句,您的意思是new[] 不是吗?)然后不要使用realloc。毕竟,你知道他们怎么说随机混合不同的化学物质,不是吗?将内存管理功能视为化学品。只需使用std::string
  • 在这 2 个可怕的选项中,2 是唯一可能的正确答案,因为 1 是未定义的行为。

标签: c++ arrays realloc


【解决方案1】:

使用 malloc(不是新的)分配块,然后使用 realloc。 realloc 知道块扩展后有多少可用空间。

s2 = realloc(s,<size>);
if (s2) {
   s = s2;
}
else {
   free up s and handle the error
}

我见过的大多数代码都不能正确处理 realloc 失败。

【讨论】:

  • 区块地址可能会改变,realloc返回区块的新地址。
【解决方案2】:

您不能将 realloc 可移植地应用于使用 new 分配的缓冲区。因此,只有您的第二种选择是可行的。

考虑切换到 std::vector 和 std::string。

【讨论】:

  • 谢谢,我知道这两个选项都很糟糕,但我只想知道纯理论。
  • 第二个选项一点也不可怕。只是我们通常通过依赖库代码来实现我们的目标少得多的汗水。如果您正在开发自己的馆藏库,那么按照选项 #2 中的建议进行操作可能是一个非常好的设计决策。
【解决方案3】:

我认为您是从 C 的角度考虑整个问题。

如果您正在处理一个数组,请使用 vector,它是动态的,可以避免您在问题中陈述的问题

例如

vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long

【讨论】:

    【解决方案4】:

    如果realloc 发现块后没有足够的可用空间,第一个选项也意味着复制。 (即使您使用malloc 分配数组,这也是使用realloc 的唯一正确选项。)

    但是,如果在每次重新分配时将数组的大小加倍(或将其大小乘以 > 1 的常数),“将数组加一”操作平均使用 常数 时间。搜索Constant Amortized Time

    假设一个初始大小为 n 的数组。重新分配到新的大小 2n 和复制需要 2n 步,但接下来的 n 个“增加”操作是免费的。

    顺便说一句,这就是std::vector 和许多其他数组容器在内部实现的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多