Ho il seguente codice C++:In che modo std: string mi impedisce di calpestare incautamente i suoi dati?
#include <string>
#include <iostream>
int main(int argc, char** argv)
{
int size;
std::string strArray[3];
std::string str0 = "String 0";
std::string str1 = "String 1";
std::string str2 = "String 2";
strArray[0] = str0;
strArray[1] = str1;
strArray[2] = str2;
for (int i = 0; i < 3; i++)
{
std::cout << strArray[i] << std::endl;
}
str1.resize(200, 'a');
for (int i = 0; i < 3; i++)
{
std::cout << strArray[i] << std::endl;
}
std::cout << str1 << std::endl;
std::cin.get();
return 0;
}
L'idea è che ho un array che è un blocco contiguo di memoria, in cui ogni elemento è uno std :: string, che sono mutevole e pertanto variabile in dimensione. Mi aspettavo che questo codice si interrompesse da quando ridimensiono lo str1 per occupare più spazio di quello originale e quindi "traboccare" in str2.
Invece ottengo questo output:
stringa0
String1
String2
stringa0
String1
String2
0.123.String1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ...
ho due domande su questo. Prima di tutto, com'è che aumentando la dimensione di str1 e aggiungendo un sacco di caratteri ad esso non scorre in str2 anche se dovrebbero essere in un blocco contiguo di memoria?
In secondo luogo, come mai quando stampo la matrice per la seconda volta dopo aver ridimensionato str1 E aggiungendo i caratteri ad essa viene ancora stampato lo str1 originale? Ho la sensazione che questo avrà qualcosa a che fare con la risposta alla mia prima domanda, ma non riesco a vedere cosa sta succedendo qui.
Le stringhe nell'array sono stringhe diverse per 'str1',' str2', 'str3'. Anche se non lo fossero, una stringa non traboccherebbe nell'altra. Altrimenti nessuno userebbe mai la classe 'std :: string'. – juanchopanza
I dati internati della classe 'std :: string' sono allocati nell'heap. –
Va notato che la modifica di 'str1' non è la stessa cosa che cambia' strArray [1] '. – MARS