【问题标题】:new and reallocating memory [duplicate]新的和重新分配的内存[重复]
【发布时间】:2013-12-19 20:11:19
【问题描述】:

new[] 不支持更改分配内存的大小,是吗?

例如,我用new[] 为缓冲区(字符数组)分配了内存,我想获得额外的内存。

在这种情况下我应该改用malloc/realloc吗?

【问题讨论】:

标签: c++ memory new-operator realloc


【解决方案1】:

new 不支持。

您可以使用newdeletememcpy 手动模仿realloc 的行为。

顺便说一句,您应该始终使用同一系列的方法,即malloc / realloc / freenew / delete,而不是将reallocnew / @ 混合使用987654334@。参见例如FMM errors reported by Purify

【讨论】:

  • 那将是 std::copy,而不是 memcpy,除非您确定您只使用可简单复制的类型。
【解决方案2】:

在不诉诸 C 保留 mallocrealloc 的情况下,最接近标准 C++ 的方法是使用 std::vector<char>。这可以随时调整大小,如果底层存储被重新分配,内容将被自动复制。

【讨论】:

  • 使用 std::vector 代替 C 字符串会影响速度吗?
  • @Dmitry 不应该,但如果这对您很重要,您应该对其进行基准测试。不同的实现可能会有所不同。
  • 好的。你认为更快的 std::vector 或 std::string 是什么?
  • @Dmitry:他们做的事情几乎一样,所以彼此的速度差不多。如果你真的需要计算纳秒,那么你将不得不对它们进行计时,或者分析生成的机器代码。
【解决方案3】:

使用std::vector。您不必处理这些问题。

【讨论】:

    【解决方案4】:

    将 malloc/realloc 与 new 一起使用不是一个好主意。

    new 应用后将不支持重新分配更多内存。

    所以一个好主意是创建一个带有额外内存的新缓冲区,memcpy 并删除旧缓冲区。 然后指向这个新缓冲区。

    【讨论】:

    • 正如 Basilevs 所说,在 C++ 中,Vector 总是更好的选择,因为它已经实现了在需要时自动调整大小。
    【解决方案5】:

    您应该改用std::vector。它可以调整大小。

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多