1

max_size() を超えたときに std::string がメモリ不足になるのを避けたいため、C++ の「char *」に一定量のデータを格納する必要があります。しかし、データはネットワークからのデータ ブロックで受信されるため、データ ブロックを取得するたびに再割り当てを使用する必要があります。C++ での char * 再割り当てと連結のためのエレガントなソリューションはありますか?

4

3 に答える 3

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
 }
于 2010-04-29T08:19:50.407 に答える
2

C の方法でmalloc()/を使用することもできますrealloc()realloc()、新しいブロックを割り当て、古いものを新しいものにコピーし、古いブロックを解放することもあります。また、正しく使用することは困難です。

巨大なバッファを割り当てたり、指数関数的に大きくしたりして、問題の重大度を相殺することができます。

または、ロープを使用することもできます。

于 2010-04-29T04:34:17.327 に答える
1

std:vector は、文字列のサイズが大きくなるにつれて自動割り当てのために頭に浮かびます。aVector<char>および push_back() 文字を心ゆくまで割り当てるだけです。

于 2010-04-29T04:35:02.397 に答える