2010-04-29 60 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