2013-05-08 10 views
9

私は、コンストラクタを使用してstd::stringchar*を変換:C++:std :: stringへのcharポインタはコンテンツをコピーしますか?

char *ps = "Hello"; 
std::string str(ps); 

私はSTDコンテナは、彼らがそれらを格納するように求められたときに値をコピーする傾向があることを知っています。 文字列全体またはポインタのみがコピーされていますか? その後、str = "Bye"を実行すると、psが「さよなら」を指すように変更されますか?

+0

割り当て演算子がオーバーロードされていますが、実際に正しく推測していれば、コピーとスワップのアルゴリズムが使用されます。一時的な文字列オブジェクトはchar *から作成されます。 –

+2

@Koushik:あなたは間違っていると思います。ここで浅いコピーを作成すると、直観に反して誤りが発生しやすくなります。 –

+0

@VioletGiraffeはい私はポインタがコピーされていないことを認識し、深いコピーがあり、これを保持する内部バッファがあるはずです。 –

答えて

20

std::stringオブジェクトは内部バッファを割り当て、そこに指し示す文字列をpsでコピーします。その文字列に対する変更は、psバッファに反映されません。逆も同様です。それは "ディープコピー"と呼ばれています。ポインタ自体だけがコピーされ、メモリの内容はコピーされなかった場合、それは「浅いコピー」と呼ばれる。

これを繰り返す:std::stringはこの場合ディープコピーを実行します。

3

strにはpsのコピーが含まれますが、strを変更するとpsは変更されません。

関連する問題