1

私はいくつかのレガシーコードを見ていますが、かなりの量のstringstream使用があります。コードは、これまでのところさまざまなタイプのメッセージを一般的に生成しています。場合によっては次のことを行っているという事実は別として:

   std::ostringstream f1;
   f1 << sDirectory << mFileName << sFileExtension << '\0';

他の人がやっている(ただのイラスト)

   std::ostringstream f1;
   f1 << sDirectory << mFileName << sFileExtension << std::ends;

これらの呼び出しは、さらにアクセスf1.str().c_str()してnull終了する必要があるためだと思います。

これらの呼び出しに違いはありますか? http://en.cppreference.com/w/cpp/io/manip/endsから、std::ends がフラッシュしないことがわかります。std::ends はプラットフォーム (Linux/Windows/Mac) によって異なりますか? どちらかを優先する必要がありますか?

さらに、バッファの割り当てを解除できるようにするためfreeze(false)に、スコープ内の後半 (使用後) に stringstreamを呼び出す必要があることを読みました ( http://en.cppreference.com/w/cpp/io/ostrstream/freeze)。繰り返しますが(おそらく私が読み間違えたか誤解した可能性があります)、呼び出しがないため、上記のすべてのストリームがリークしていることを示していますか?str()freeze(false)

NB 参考までに、これは Visual Studio 2005/Windows 7 ですが、問題があるかどうかはわかりません。

密集していたらすみません...

4

1 に答える 1

1

std::ends次の効果があると定義されています。

出力シーケンスにヌル文字を挿入します:calls os.put(charT())

charTの場合char、値が0になるように初期化された値です。これは、文字リテラルと同等\0です。したがって、charTcharの場合、通常はそうですが、2行のコードはまったく同じです。

ただし、std::endsストリームの文字タイプがでなくても、を使用するとうまく機能しますchar

于 2013-02-06T15:58:39.303 に答える