2017-12-28 15 views
-1

Ich praktizierte Sortierung und Zeiger für meine Alg-Klasse - es ist ein einfaches Programm, das einen Benutzer fragt nach der Anzahl der Namen, die man eingeben möchte, fragt dann nach diesen Namen und sortiert sie dann aus.Löschen eines Zeigers zu einem sortierten String-Array gibt mir einen Fehler nach der Ausführung

string *sortname(string array[], int number) 
{ 
    for (int i = 0; i < number - 1; i++) 
    { 
     int smallestIndex = i; 
     for (int j = i + 1; j < number; j++) 
     { 
      if (array[smallestIndex] > array[j]) 
       smallestIndex = j; 
     } 
     swap(array[i], array[smallestIndex]); 
    } 

    return array; 
} 

int main() 
{ 
cout << "enter the number of names you wish to enter." << endl; 

int number; 
cin >> number; 

string *array = new string[number]; 

for (int i = 0; i < number; i++) 
{ 
    cout << "enter name #" << i+1 << ":"; 
    cin >> array[i]; 
} 

cout << "the names are: " << endl; 
for (int i = 0; i < number; i++) 
{ 
    cout << array[i] << endl; 
} 

string *sorted; 
sorted = sortname(array, number); 

cout << "the sorted names are: " << endl; 
for (int i = 0; i < number; i++) 
{ 
    cout << sorted[i] << endl; 
} 

delete[] array; 
delete[] sorted; 

return 0; 
} 

Ich bin mir bewusst, dass die Funktion sortname kann void und Rückkehr nichts eingestellt werden, aber ich wollte nur, um zu versuchen (aus Gründen der Praxis) zurückkehrt. Wenn ich jedoch am Ende ein delete[] sorted hinzufüge, stürzt die Konsole ab, nachdem es den sortierten Namen auflistet. Wenn ich nur delete[] array es funktioniert gut, obwohl die sortierten sollte auch gelöscht werden ... irgendwelche Hinweise?

+3

Weil Sie das gleiche Array doppelt löschen. –

+0

ah ich sehe, danke dafür, jetzt macht es vollkommen Sinn! –

+0

Ich habe nichts mit dem Zeiger sortiert, da das Haupt-Array gelöscht wurde. Danke für die Hilfe –

Antwort

3

sortname gibt eine Kopie des Arguments array zurück.

So zeigt sorted auf das gleiche Array wie array. Daher wird array gelöscht, die sorted verweist auf dieses gelöschte Array. Es zeigt nicht mehr auf ein gültiges Objekt.

Das Löschen eines Zeigers, der nicht auf ein Objekt zeigt, hat ein nicht definiertes Verhalten.


Eine Faustregel: Sie brauchen für jedes neue genau einen Löschvorgang. Du hast einmal neu angerufen. Der zweimalige Aufruf von delete ist mehr als einmal.

Eine andere Faustregel: Speicher niemals direkt reservieren. Sie hätten stattdessen std::vector verwenden können.

Verwandte Themen