Frage

Ich habe zuvor eine verwandte Frage zu diesem Thema gestellt, daher weiß ich, dass es sich um ein undefiniertes Verhalten handelt.

const char* an char* zurückgeben und dann die Daten ändern

string _str = "SDFDFSD";
char* pStr = (char*)_str.data();
for (int i = 0; i < iSize; i++)
    pStr[i] = ::tolower(pStr[i]);

Ich hatte mit einem meiner Kollegen eine Diskussion darüber.Und er sagte mir, dass es in diesem Szenario nie zu Problemen führen würde, wenn ich nicht die Länge der Daten ändere.Wenn ich die Daten ändere, aber die Länge beibehalte, wird es nie zu Problemen kommen, da es dafür keine Möglichkeit gibt std::string um zu erkennen, dass Daten geändert wurden.Es wird auch keine interne Inkonsistenz verursachen _str.Ist das wirklich so?

War es hilfreich?

Lösung

Undefiniertes Verhalten Ich fürchte, es wurde zu sehr verunglimpft, und Verweise auf Nasendämonen scheinen die meisten Menschen davon überzeugt zu haben, dass es mythischer als alles andere war.

Es scheint, dass Ihr Kollege so desensibilisiert ist, dass er, um Sie zu überzeugen, konkrete Beweise für das Problem vorlegen muss.Wenn Sie gcc zur Hand haben, können Sie Folgendes tun:

#include <iostream>
#include <string>

int main() {
    std::string const UPPER = "HELLO, WORLD!";
    std::cout << "UPPER: " << UPPER << "\n";

    std::string lower = UPPER;
    for (char* begin = const_cast<char*>(lower.data()),
         * end = begin + lower.size();
         begin != end;
         ++begin)
    {
        *begin = std::tolower(*begin);
    }
    std::cout << "lower: " << lower << "\n";
    std::cout << "UPPER: " << UPPER << "\n";
    return 0;
}

Wenn Sie gcc verwenden, Hier ist, was Sie bekommen:

UPPER: HELLO, WORLD!
lower: hello, world!
UPPER: hello, world!   // What the hell ? UPPER was const !!!

Warum ?Weil gcc in der Vergangenheit verwendet wurde Beim Schreiben kopieren, und seit dir betrogen Der Schreibvorgang wurde nicht erkannt und daher wird das zugrunde liegende Speicherarray gemeinsam genutzt.

Notiz:Ja, das ist nicht konform mit C++11. Ich wünschte, ich hätte die Chance, in C++11 zu arbeiten.

Andere Tipps

Gemäß der Daten() Dokumentation:

Das Ändern des Zeichenarrays, auf das über Daten zugegriffen wird, ist ein undefiniertes Verhalten.

Ihr Kollege hat also Unrecht, es gibt keinen Trick, es ist undefiniertes Verhalten.Was passiert, ist Implementierungsspezifisch.

Schlechte Idee!Sie können nicht sicher wissen, wie String auf einer aktuellen oder zukünftigen Plattform implementiert wird.Beispielsweise könnte es sein, dass der Speicher mit anderen Objekten geteilt wird, die irgendwie ähnlich sind.Auf einigen Plattformen könnten die Daten in einem schreibgeschützten Segment abgelegt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top