2010-04-29 99 views
1

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

+7

我不明白你说的关于'的std :: string'运行内存是什么。如果你使用那么多的记忆,你需要把事情联系在一起。否则,当你完成它时,不要将字符串保留。 – GManNickG 2010-04-29 04:31:48

+2

你有没有证据证明'std :: string'不能用来完成这个? – 2010-04-29 04:45:52

回答

2

你可以去C的方式并使用malloc()/realloc(),但realloc()只会分配一个新的块,将旧的东西复制到新的东西,并有时无论如何释放旧的块。也很难正确使用。

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

或者您可以使用ropes

+0

“你可以分配一个巨大的缓冲区和/或以指数级增长,抵消问题的严重性。”注意:大多数'std :: string'实现已经这样做了。 – 2010-04-29 04:39:18

+0

@比利 - 这并不奇怪。我想知道OP是否知道他会遇到分配问题,或者他是否过早地进行了优化。 – 2010-04-29 04:45:22

+0

通常情况下,如果在块之后的内存空间中没有空间,realloc只需要进行复制(当然,这完全取决于实现,但是我已阅读的所有内容(以及我编写的少数内容)优化对于那种情况)。 – paxdiablo 2010-04-29 04:54:51

1

std:随着字符串的大小增大,想到自动分配的向量。只需将Vector<char>和push_back()字符分配给您的内容。

+2

这与OP表示他明确希望避免的99%的时间没有不同。 – 2010-04-29 04:39:00

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 
} 
+1

错误..这是4GiB,而不是8。 – 2010-04-29 12:40:53

+1

不适用于'字符串'(根据定义,'sizeof(char)'是1)。对于'wstring'元素的大小可能是2. – 2010-04-29 15:03:18

+0

mybad,编辑... – aCuria 2010-04-30 02:26:41