2013-05-17 3 views
13

何かが誤解されているかどうか疑問に思う:コピーコンストラクタはstd::stringではないの内容をコピーしますか?std :: stringコピーコンストラクタGCC 4.1.2では深くありませんか?

string str1 = "Hello World"; 
string str2(str1); 

if(str1.c_str() == str2.c_str()) // Same pointers! 
    printf ("You will get into the IPC hell very soon!!"); 

「これはすぐにIPC地獄に入ります!それは私を悩ます。

通常の動作はstd::stringですか?私はそれが通常深いコピーを行うというどこかを読んでいます。

しかし、これは期待通りに動作します:

string str3(str1.c_str()); 

if(str1.c_str() == str3.c_str()) // Different pointers! 
    printf ("You will get into the IPC hell very soon!!"); 
else 
    printf ("You are safe! This time!"); 

それをコピーした内容を新しい文字列に。

+0

'最初の例でstr2'(例えば' STR2 [0] = 'B'; ')を変更してみてください 'c_strを(比較*次いで及び*を) '値を返します。 – Angew

+0

GCC 4.7は、C++ 03とC++ 11の両方のモードで同じ動作をします(@ Angewの提案では、実際には異なる 'c_str()'値が得られます)。 – syam

+0

明らかに、@Ungewを編集した後、新しいバッファを割り当てます。だから、ある種の "最適化"のようです...その問題を見つけるのに数時間の労力を要しました* –

答えて

14

あなたのstring実装では、動作を説明するコピーオンライトを使用することは完全に可能です。これは、新しい実装(およびC++ 11実装での非準拠)ではあまりありませんが。

標準では、c_strによって返されたポインタの値に制限はありません(ヌル終端のC文字列を指しています)ので、コードは本質的に移植性がありません。

+0

なぜ新しい実装ではCOWの可能性が低くなりますか? – user93353

+2

@ user93353 C++ 11に準拠させたい場合、COWを実装することはできません:http://stackoverflow.com/questions/12199710/legality-of-cow-stdstring-implementation-in-c11 – pmr

+0

@ user93353:COWマルチスレッド環境でパフォーマンスを大幅に低下させる可能性があります。その理由から、多くの人気を失っています(C++ 11では禁止されています)。 – Grizzly

5

std::string実装は参照カウントでなければなりません。文字列の1つを変更し、ポインタをもう一度チェックしてください - それらは異なるでしょう。

string str1 = "Hello World"; 
string str2(str1); 

if(str1.c_str() == str2.c_str()) // Same pointers! 
    printf ("You will get into the IPC hell very soon!!"); 

str2.replace(' ',','); 

// Check again here. 

これは、リファレンスカウント文字列の3つの優れた記事です。

http://www.gotw.ca/gotw/043.htm

http://www.gotw.ca/gotw/044.htm

http://www.gotw.ca/gotw/045.htm

+0

私は、質問そのものについての私のコメントで指摘したように、上記のように書いています。 –

関連する問題