2016-05-05 5 views
1

C++ 11はstd::stringがnulターミネータを内部的に格納することを保証します。明示的なterminateメソッドなしでどのように達成できますか?std :: stringはNUL charをどのように追跡するのですか

例:

std::string foo("Baz"); 
printf("foo contains %s\n",&foo[0]); //Completely safe 
+2

私は質問を理解していますか分かりません。あなたは何を意味するのか説明できますか?例えば、なぜ 'terminate'メソッドが必要なのでしょうか? – erip

+0

おそらく最後の文字としてターミネータを持つ、少なくとも 'size()+ 1'文字の配列へのポインタを持っているでしょう。 –

+0

文字列コンストラクタは文字列をコピーし、ヌルターミネータを追加します。 – Dani

答えて

4

標準は、あなたがdata()から取得した文字列はNULで終了し、the references generated from operator[] are contiguous and NUL terminatedことを必要とされている必要があります。それはすべての仕様がそれについて言うことです。

これを実行するのは実装の仕事です。通常、文字列の最後にNULターミネータを格納するだけで、実際のバッファサイズは表示されるよりも大きくなります。文字を追加すると、新しく追加された一連の文字の末尾にNULターミネータが格納されます。文字を削除すると、NULターミネータが適切に移動します。

これは、カプセル化されたタイプができることです。彼らは不変量を確立し維持することができます。

関連する問題