【问题标题】:Char * reallocation in C++C++ 中的 Char * 重新分配
【发布时间】:2011-02-13 15:42:51
【问题描述】:

我需要在 C++ 中的“char *”中存储一定数量的数据,因为我想避免 std::string 在超过 max_size() 时耗尽内存。但是数据来自网络的数据块,所以我每次获取数据块时都需要使用重新分配。 C++ 中的 char * 重新分配和连接有什么优雅的解决方案吗?

【问题讨论】:

  • 我不明白你所说的 std::string 内存不足。如果您正在使用那么多内存,则需要将它们组合在一起。否则,完成后不要保留字符串。
  • 你有任何证据证明std::string 不能用来完成这个吗?

标签: c++ char concatenation dynamic-memory-allocation


【解决方案1】:

您可以采用 C 方式并使用 malloc() / realloc(),但 realloc() 只会分配一个新块,将旧内容复制到新内容中,并且有时无论如何都会释放旧块。也很难正确使用。

您可以分配一个巨大的缓冲区和/或以指数方式增长它,从而抵消问题的严重性。

或者你可以使用ropes

【讨论】:

  • “你可以分配一个巨大的缓冲区和/或以指数方式增长它,从而抵消问题的严重性。” std::string 实现已经这样做了。
  • @Billy - 这并不奇怪。我想知道 OP 是否知道他会遇到分配问题,或者他是否过早地进行优化。
  • 通常,realloc 只需要在块后内存区域没有空间的情况下进行复制(当然,这完全取决于实现,但我读过的所有内容(以及我写的很少)针对这种情况进行优化)。
【解决方案2】:

std:vector 会随着字符串大小的增长而自动分配。只需分配一个 Vector<char> 和 push_back() 字符即可满足您的需求。

【讨论】:

  • 这在 99% 的情况下与 std::string 没有什么不同,OP 表示他明确希望避免这种情况。
【解决方案3】:

在 Visual Studio 中,max_size() 是 4294967294 个字符,大约 4Gb。如果你能告诉我们你是如何冒着超过这么多字符的风险的,那将会很有趣。

如果问题不经常出现,而这只是为了使其故障安全,那么

 myConcatStr(string str1, string str2)
 {
      if (str1.length() + str2.length()) <= str1.max_size() // if there is no overflow problem
           str1.append(str2); // use stl append
      else
           //use alternate method instead or throw an exception
 }

【讨论】:

  • 不适用于stringsizeof(char) 定义为 1)。对于wstring,元素的大小可能是 2。
猜你喜欢
  • 2014-11-02
  • 2016-06-27
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2020-08-07
  • 2018-03-20
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多