2013-04-11 7 views
5

は:文字列の割り当てと割り当ての割り当ては安全ですか?私が持っている場合は

#include <string> 

std::string myString = "Hello"; 

を、その後のいずれかの操作を行います。

myString = "Hello World"; 

または

myString+= " World"; 

は、私はいくつかの他のメモリ上の書き込みのリスクがあるのですか?
文字列関数を使用して文字列のサイズを追加または変更する必要がありますか?

答えて

7

std::stringの場合は、std::stringが独自のメモリを管理しているため、これはまったく問題ありません。

char*を使用するCスタイルの文字列では、独自のメモリを管理する必要があります。

+0

ありがとうございました!私はそれが簡単だろうと思っていた。 – Tez

+2

これが 'string'がライブラリに追加された主な理由です。 – Barmar

1

string使用すると、あなただけのような他のプリミティブデータ型と同じように扱うの贅沢を与えるintfloatなど

int a = 3;

同じ害なしa = 5またはa += 3に対して行うことができるが

string myString = "Hello"; 

myString = "Hello World"; 

myString+= " World"; 
のために行きます
+0

私はそれが正しいとは思わない。たとえば、unsigned charは255までしか上がりません。それ以上であれば動作しません。文字列を使用すると、好きなだけ追加し続けることができます(コンピュータがメモリ不足になるまで)。私はC++を初めて使ったので推測していますが。あなたの例のように整数に3を加えると、格納されている値だけを変更するだけで、 'int'の容量を増やすことはありません。 – Tez

+0

@ Teesはい、それを明確にしてくれないのは残念です。 doin '+ = 3'で' int'の 'size'を増やすつもりはありませんでした。 'std :: string'で' + 'などで文字列に保持されているデータを変更できることを示したいと思いました。' char * 'などで' strcat() 'を使う必要があります... –

+0

ああ。害はありません:) – Tez

5

std stringは、ベクターのような他のコンテナクラスとまったく同じです。彼らはまた、連続したメモリ構造を持ち、余分なスペースが必要なときには、メモリをただちに再割り当てします。

文字列が頻繁に更新され、文字列が時間的に大きくなる場合は、string :: reserve()メソッドを呼び出して文字列のメモリを事前に割り当てて、新しい挿入によって大量メモリの移動

+0

*伝染病*の代わりに*連続*記憶を意味しますか? – Default

+0

@Default申し訳ありませんが、私は連続している –