0

乱数のリストを含むテキストファイルを読み、マージソートを使用してそれらを並べ替えて表示しようとしています。数値は動的配列に読み込まれます。残念ながら、使用されていないアレイを削除しようとすると、ヒープ破損エラーが検出されます。

マージソート関数:

void mergesort(int *arr, int first, int last)
{
if(first < last)
   {
   int middle = ((first + last)/2);
   mergesort(arr, first, middle);
   mergesort(arr, middle+1, last);
   merge(arr, first, last); 
   }
}

tempArrを削除すると、マージ関数でエラーが発生します。

void merge(int *arr, int first, int last)
{
int *tempArr = new int[last];

int mid = (first+last)/2;
int first1 = first;
int last1 = mid;
int first2 = mid + 1;
int last2 = last;

int index = first1;

for(; (first1 <= last1) && (first2 <= last2); ++index)
{
    if (arr[first1] < arr[first2])
    {
        tempArr[index] = arr[first1];
        ++first1;
    }
    else
    {
        tempArr[index] = arr[first2];
        ++first2;
    }
}

for(; first1 <= last1; ++first1, ++index)
    tempArr[index] = arr[first1];

for(; first2 <= last2; ++first2, ++index)
    tempArr[index] = arr[first2];

for(index=first;index<=last;++index)
    arr[index] = tempArr[index];

delete [] tempArr;
}
4

1 に答える 1

6

問題は、配列をとして割り当てることのようですint *tempArr = new int[last]。その要素の数はでlastあり、それらのインデックスは、、、0...1ですlast - 1

関数の終わり近くに、これがあります:

for(; first2 <= last2; ++first2, ++index)
    tempArr[index] = arr[first2];

last2の値に初期化されますlast。これは、ループ内の最終的な割り当てがwhenindex == lastになることを意味するため、にアクセスしtempArr[last]ます。これは配列の範囲外です。

于 2013-02-19T10:34:49.723 に答える