Dies ist in der Regel nicht sicher, unabhängig davon, ob die interne Zeichenfolge Sequenz im Speicher kontinuierlich gespeichert ist oder nicht. Es gibt möglicherweise viele andere Implementierungsdetails, die sich darauf beziehen, wie die gesteuerte Sequenz neben der Kontinuität durch das Objekt std::string
gespeichert wird.
Ein echtes praktisches Problem damit könnte das Folgende sein. Die gesteuerte Sequenz von std::string
muss nicht als Null-terminierte Zeichenfolge gespeichert werden. In der Praxis entscheiden sich jedoch viele (die meisten?) Implementierungen dafür, den internen Puffer um 1 zu vergrößern und die Sequenz trotzdem als nullterminierte Zeichenfolge zu speichern, da dies die Implementierung der Methode c_str()
vereinfacht: Geben Sie einfach einen Zeiger auf den internen Puffer zurück erledigt.
Der Code, den Sie in Ihrer Frage angegeben haben, unternimmt keine Anstrengungen, die Daten, die er in den internen Puffer kopiert hat, auf Null zu setzen. Möglicherweise weiß es einfach nicht, ob eine Null-Terminierung in dieser Implementierung von std::string
notwendig ist. Es ist sehr wahrscheinlich, dass es darauf ankommt, dass der interne Puffer nach dem Aufruf von resize
mit Nullen gefüllt wird, so dass das zusätzliche Zeichen, das für den Nullabschluss durch die Implementierung zugewiesen wird, bequem auf Null voreingestellt ist. All dies ist Implementierungsdetail, was bedeutet, dass diese Technik von einigen eher fragilen Annahmen abhängt.
Mit anderen Worten, in einigen Implementierungen müssten Sie wahrscheinlich strcpy
, nicht memcpy
verwenden, um die Daten so in die kontrollierte Sequenz zu zwingen. In einigen anderen Implementierungen müssten Sie memcpy
und nicht strcpy
verwenden.
Die Verwendung von & s [0] ist OK, memcpy() wohl weniger. Warum nicht einfach eine Zuweisung machen oder die member-Funktion assign() benutzen? –
@Neil Butterworth, das frage ich mich beim Betrachten dieses Codes ...;) – paxos1977
Wenn Sie Erfahrung in C++ programmieren, werden Sie mehr und mehr von 'memset' und' memcpy' ablassen und lernen die Begründung. Dies ist einer Ihrer Erfahrungen hinzuzufügen. –