Question

J'ai demandé à une question connexe précédemment au sujet de ce que je sais c'est un comportement indéfini.

de retour const char* char* et ensuite de changer les données

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

J'ai eu une discussion avec un de mes collègues à ce sujet.Et il m'a dit qu'il ne cause pas de problème dans ce scénario de jamais, sauf si je change la longueur des données.Si je change les données, mais de garder la longueur même qu'il ne pose aucun problème car il n'existe aucun moyen pour std::string pour détecter que des données ont été modifiées.Il ne causera pas d'incohérence interne, soit dans _str.Est-ce vraiment le cas?

Était-ce utile?

La solution

Un Comportement Indéfini a été décrié trop, j'ai peur, et les références nasale, les démons semblent avoir convaincu la plupart des gens qu'il était plus mythique qu'autre chose.

Il semble que votre collègue a été désensibilisé, pour convaincre, vous devez donc lui apporter la preuve concrète de la question.Heureusement, si vous avez de la gcc à la main, il peut être fait:

#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;
}

Si vous utilisez gcc, voici ce que vous obtenez:

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

Pourquoi ?Parce que gcc a toujours utilisé La Copie Sur Écriture, et puisque vous triché il n'a pas détecté de l'écriture et donc la sous-jacentes de la matrice de stockage est partagé.

Note:oui, c'est la non-conforme avec le C++11, je souhaite que j'aie eu la chance de travailler dans C++11 si.

Autres conseils

Comme par le de données() documentation:

Modification du tableau des caractères accessibles par le biais de données est un comportement indéfini.

Si votre collègue est faux, il n'y a pas de truc, c'est un comportement indéfini.Ce qui arrive est de la mise en œuvre spécifique.

Mauvaise idée!Vous ne pouvez pas savoir quelle chaîne est mise en œuvre sur le présent ou le futur de la plateforme.Par exemple, il pourrait être le partage de stockage avec d'autres objets qui sont en quelque sorte similaire.Il pourrait être de mettre les données en lecture seule segment sur certaines plates-formes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top