2013-05-08 13 views
9

Wenn ich konvertieren ein char*-std::string den Konstruktor:C++: Kopiert char Zeiger auf Std :: String-Konvertierung den Inhalt?

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

Ich weiß, dass std Behälter neigen dazu, Werte zu kopieren, wenn sie sie zu speichern, werden gebeten. Wird die ganze Zeichenfolge kopiert oder nur der Zeiger? Wenn ich danach str = "Bye" mache Ändere ps auf "Bye" zu zeigen?

+0

sie haben Zuweisungsoperatoren überladen und tatsächlich, wenn ich richtig rate, würden sie kopieren und Swap-Algorithmus verwenden. und ein temporäres String-Objekt wird aus char * erstellt. –

+2

@Koushik: Sie raten falsch. Eine seichte Kopie wäre hier nicht intuitiv und fehleranfällig. –

+0

@VioletGiraffe ja ich weiß, der Zeiger wird nicht kopiert und es gibt eine tiefe Kopie und es sollte ein interner Puffer sein, um dies zu halten. –

Antwort

20

std::string Das Objekt wird den internen Puffer zuweisen und die Zeichenfolge, auf die ps verweist, dorthin kopieren. Änderungen an dieser Zeichenfolge werden nicht in den Puffer ps übernommen und umgekehrt. Es heißt "Deep Copy". Wenn nur der Zeiger selbst kopiert würde und nicht der Speicherinhalt, würde dies "flache Kopie" genannt werden.

Um zu wiederholen: std::string führt tiefe Kopie in diesem Fall.

3

str enthält eine Kopie von ps, ändert str ändert sich nicht ps.