Frage Hat std :: string :: assign die Eigenschaft "Eigentümer" der Zeichenkette?


Ich habe einige Lücken im Verständnis von string::assign Methode. Betrachten Sie den folgenden Code:

char* c = new char[38];
strcpy(c, "All your base are belong to us!");
std::string s;
s.assign(c, 38);

Tut s.assign weise einen neuen Puffer zu und kopiere den String in ihn oder er übernimmt den Besitz des Zeigers; d. h. reserviert keinen neuen Speicher und verwendet direkt meine Adresse. Wenn es kopiert, was ist der Unterschied zwischen assign und operator=? Wenn es nicht kopiert, befreit es dann die Erinnerung oder es ist meine Verantwortung?

Vielen Dank.


23
2017-07-12 13:20


Ursprung


Antworten:


Ordnet an assign einen neuen Puffer zu und kopiert den String hinein oder es übernimmt Besitz des Zeigers;

Die STL-String-Methode assign kopiert das Zeichenarray in die Zeichenfolge. Wenn der bereits zugewiesene Puffer in der Zeichenfolge nicht ausreicht, wird der Speicher intern neu zugewiesen. Die STL-Zeichenfolge wird nicht Besitz des ursprünglichen Arrays übernehmen.

Wenn es kopiert, was ist dann der Unterschied zwischen assign und operator =?

Beide sollten auf die gleiche Art und Weise funktionieren, aber es gibt eine Reihe von Überlastungen bei der STL Assign-Methode, die Ihnen mehr Kontrolle darüber geben, was passiert. Sieh dir das an diese Seite für mehr Informationen.

UPDATE: Die MSDN hat eine Anzahl von Beispielen von den verschiedenen assign Überladungen.

Wenn es nicht kopiert, befreit es dann die Erinnerung oder es ist meine Verantwortung?

Nein, der ursprüngliche Zeiger auf das Zeichenfeld liegt immer noch in Ihrer Verantwortung.


29
2017-07-12 13:23



Es kopiert. Der Unterschied zwischen zuordnen und operator = Sie können die Anzahl der zu kopierenden Zeichen angeben einschließlich Nullzeichen. Der Operator = kopiert nur den C-String bis zum ersten Nullbyte.


15
2017-07-12 13:29



Soweit ich mich erinnern kann, liegt es an der Implementierung Ihres Compilers. Einige können Kopier-auf-Schreib-Optimierungen verwenden und erstellen daher keine Kopie, bis Sie den Wert ändern. Die meisten Implementierungen kopieren jedoch nur die Zeichenfolge.

Aber alle Implementierungen kümmern sich um die Bereinigung - Sie müssen also den Zeichenfolgenspeicher nicht manuell freigeben (darum geht es bei String-Objekten). Natürlich müssen Sie Ihre String-Objekte freigeben, wenn sie auf dem Heap erstellt wurden (oder einen Smartpointer benutzen);)

Assign und Operator = können in Bezug aufeinander implementiert werden, da sie dasselbe tun - je nachdem, welche Version der Zuweisung aufgerufen wird (für alle Überladungen siehe cpp-Referenz).


1
2017-07-12 13:29