【问题标题】:How to allocate more memory for a buffer in C++?如何在 C++ 中为缓冲区分配更多内存?
【发布时间】:2010-03-12 08:57:03
【问题描述】:

我有指针str:

char* str = new char[10];

我使用str指向的内存块来存储数据。

如何为str 指向的缓冲区分配更多字节,并且不丢失缓冲区中存储的旧数据?

【问题讨论】:

  • 你应该参加一些编程课程。
  • 考虑使用std::vector,它将免费提供

标签: c++ memory memory-management


【解决方案1】:

改用 std::string。它可以满足您的需求,而无需担心分配、复制等问题。您仍然可以通过 c_str() 函数访问原始内存。

即使是 std::vector<char> 也能很好地为您服务。

【讨论】:

    【解决方案2】:

    new[]另一个缓冲区,将数据复制到那里(使用memcpy()),然后delete[]旧缓冲区,将新缓冲区地址分配给最初保存旧缓冲区地址的指针。

    【讨论】:

      【解决方案3】:

      您不能使用new 构造。为此,您需要使用旧的 mallocreallocfree(不要混合使用 malloc/realloc/free 和 new/delete)。

      【讨论】:

      • 其实你可以——new[]一个新的缓冲区,复制数据,delete[]旧的。不是单行的,但这就是 realloc() 所做的。
      • @sharptooth:不完全是。操作系统(至少是 linux)将尝试实际增加内存。如果分配空间后有足够的连续空间,则该操作不会产生复制成本。
      • @David Rodríguez - dribeas:是的 - 在实施方面 - 但 OP 并不坚持“不复制”,他只要求保留数据。
      • @David:这种 realloc 行为给很多程序员带来了麻烦。恕我直言,调试编译中的 realloc 应该总是移动块,这样程序员就不会养成忽略其返回地址的习惯。
      【解决方案4】:

      如果你真的在使用 C++,最正确的解决方案是使用 std::vector。我假设您没有将该信息用作标准字符串,在这种情况下,您应该使用 std::string (这是 std::vector 的专门化,所以没什么大不了的)。您正在创建至少 10 个字符。这给了我一个提示,你可能很确定你需要 10 个字符,但也许你会需要更多。也许您担心分配和释放内存所涉及的性能问题。在这种情况下,您可以创建字符串,然后保留您预计需要的估计容量,因此至少在达到该限制之前不会进行任何重新分配。

      int main()
      {
          std::string s;
          s.reserve( 10 );
          // do whatever with s
      }
      

      正如其他人已经指出的那样,使用 std::string 或 std::Vector 将使您忘记复制、调整大小或删除保留内存的好处。

      【讨论】:

        【解决方案5】:

        realloc 函数就是您要搜索的。您必须使用 malloc/free 而不是 new/delete 才能使用它

        【讨论】:

        • 不确定,为什么这被否决了,OP 要么需要使用 std::string/std::vector 要么需要使用 malloc/realloc/free 而不是分配内存新建/删除。
        【解决方案6】:

        您必须分配一个不同的、更大的字符串数组,并将数据从 str 复制到新的字符串数组。

        【讨论】:

          【解决方案7】:

          分配有点像找停车位。 您在这里询问是否可以在已停放几天的汽车上添加拖车。

          答案是,在 C 语言中存在一种叫做 realloc 的东西,它允许你做以下事情。 如果我已经有足够的地方添加我的预告片,那就这样做吧。如果没有把你的拖车和你的车停在另一个足够大的地方,这相当于复制你的数据。

          换句话说,您将获得强大且随机的性能命中。

          那么你会在现实世界中做什么?如果您知道您可能需要在汽车上添加一些拖车,您可能会将车停在比要求更大的地方。当超过该地点所需的尺寸时,您会将您的汽车和拖车移动到一个为将来的拖车留有充足余量的地方。

          这正是 STL 的字符串和向量正在为您做的事情。您甚至可以通过调用“reserve”来向他们暗示您的期货预告片的大小。使用 std::string 可能是您问题的最佳答案。

          【讨论】:

            【解决方案8】:

            您可以使用 realloc:http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/ 我要补充一点,这种方法不是最受青睐的 c++ 方法(例如,根据您的需要,您可以使用 std::vector<char>)。

            【讨论】:

            • 请注意realloc 可能会默默地移动分配,从而使其他指针无效。
            • 你说得对。实际上,在一个 C++ 程序中,我建议不要使用它(曾经有一个对 C 的引用,现在已经被编辑掉了,当我第一次回答时)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-17
            • 1970-01-01
            • 2014-11-11
            • 2014-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多