2016-10-31 4 views
0

Ich versuche mein erstes echtes Programm mit dynamischen Arrays zu schreiben, aber ich bin auf ein Problem gestoßen, das ich nicht verstehen kann. Im Grunde versuche ich ein dynamisches Array zu nehmen, es in ein temporäres Array zu kopieren, dem ursprünglichen Array eine weitere Adresse hinzuzufügen und dann alles wieder in das ursprüngliche Array zu kopieren. Jetzt hat das ursprüngliche Array eine Adresse mehr als zuvor. Dies funktionierte perfekt, wenn man mit Ints versuchte, aber Saiten stürzten mein Programm ab. Hier ist ein Beispiel für den Code mit Ich bin zu kämpfen:Zuweisen einer neuen Zeichenfolge stürzt ab?

void main() 
{ 
int x = 3; 
std::string *q; 
q = new std::string[x]; 

q[0] = "1"; 
q[1] = "2"; 
q[2] = "3"; 

    x++; 
    std::string *temp = q; 
    q = new std::string[x]; 
    q = temp; 
    q[x-1] = "4"; 

    for (int i = 0; i < 5; i++) 
    std::cout << q[i] << std::endl; 
} 

Wenn ich q und Temperatur in Zeiger machen statt String in int dann das Programm läuft gut. Jede Hilfe würde sehr geschätzt werden, ich bin seit einer oder zwei Stunden darauf festgefahren.

+0

vergleichen 'q = neue std :: string [x];' mit 'q = temp;' ... das '=' symbol bedeutet in beiden Fällen das Gleiche –

Antwort

1

q = temp führt nur eine flache Kopie. Sie verlieren das Original q und alle Zeichenfolgen, auf die es zeigte.

Da umverteilt Sie q 4 Elemente haben, aber dann sofort erneut zugewiesen temp (die nur mit 3 Elementen zugeordnet wurde), Zugreifen (und Zuordnen) das Element bei x jetzt außerhalb der Grenzen des Arrays ist.

Wenn Sie es auf diese Weise aus irgendeinem Grunde zu tun haben, sollte es so aussehen:

auto temp = q; 
q = new std::string[x]; 

for(int x = 0; x < 3; ++x) 
    q[x] = temp[x]; 

delete [] temp; 
q[x] = 4; 

Dies ist jedoch offensichtlich komplexes und sehr viel anfälliger für Fehler als der idiomatische Weg, dies zu tun in C++. Besser zu verwenden std::vector<std::string> stattdessen.

+0

Ok, ich werde es versuchen. Vielen Dank –