数日前、コードが次のような微妙なバグに遭遇しました。
ostringstream ss;
int anInt( 7 );
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
問題は、ends
が '\0' を に貼り付けていたostringstream
ため、theWholeLot
実際には次のように見えたことです"7HABITS\0"
(つまり、最後に null が表示されます)。
を使用して部分をtheWholeLot
取得するために使用されていたため、これは表示されませんでした。これは、ヌルが単なる区切り文字になったため、マスクされたことを意味します。ただし、これが文字列を使用するように変更されたとき、null は突然何かを意味し、次のような比較が行われました。const char *
string::c_str()
if ( theWholeLot == "7HABITS" )
失敗するでしょう。これは私に考えさせました:おそらく理由は、ストリームが通常はnullで終了せず、(その後、 a ではなく a をキャストする)が正しく機能するようにする必要があっends
た時代への逆戻りです。ostrstream
str()
string
char *
ただし、 achar *
から aをキャストすることができないためostringstream
、使用ends
は不要であるだけでなく、潜在的に危険であり、クライアント コードからすべて削除することを検討しています。
唯一の環境で使用ends
する明白な理由を誰でも見ることができますか?std::string