2017-12-28 18 views
-1

私はalgクラスのソートとポインタを練習していました。入力したい名前の数を入力するようにユーザーに指示する単純なプログラムです。それらの名前を尋ね、それを並べ替えます。ソートされた文字列配列へのポインタを削除すると、実行後にエラーが発生する

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

私は機能sortnamevoidに設定し、何も返さないことを承知していますが、私はちょうど(練習のために)戻って試してみたかったです。 しかし、最後にdelete[] sortedを追加すると、ソートされた名前がリストされた後にコンソールがクラッシュします。私はちょうどdelete[] arrayそれがうまくいけば、並べ替えも同様に削除する必要があります...任意のヒント?

+3

同じアレイをダブルで削除しているためです。 –

+0

ああ、ありがとう、今それは完璧な意味があるよ! –

+0

メイン配列が削除されているので、ソートされたポインタで何もする必要はありません。助けてくれてありがとう –

答えて

3

sortnameは、そのarray引数のコピーを返します。

したがって、sortedarrayと同じ配列を指します。したがって、arrayが削除されると、sortedは削除された配列を指します。それはもはや有効なオブジェクトを指していません。

オブジェクトを指していないポインタを削除すると、未定義の動作が発生します。


経験則:新しいものごとに1つの削除が必要です。あなたは新しいことを一度呼びました。削除を2回呼び出すことは複数回です。

もう1つの経験則:メモリを直接割り当てないでください。代わりにstd::vectorを使用している可能性があります。

関連する問題