0

数値の反転をカウントするように記述し、正常に実行しましgcc version 4.2.1 20070831 patchedたが、それを使用してコードブロックで実行すると、mingw32誤って閉じてしまいます。

デバッグして、それがint *left = new int[middle];int *right = new int[length - middle];butit just come to error when it recursive on second timeにあることがわかりました。なぜエラーが発生するのか、修正方法がわかりません。

私の質問は

1.エラーを修正するには?

2.確認したいだけかどうかわからないため、削除しなかった他のヒープが失われましたか。

事前にt​​hx。

#include<iostream>
using namespace std;
int invCount(int*, int);
int merge(int*, int*, int, int*, int);
int main(void){
    int array[] = {0, 1, 4, 3, 2};
    cout << invCount(array, 5) << "times" << endl;
    return 0;
}
int invCount(int *array, int length){
    cout << "length:" << length << endl;

    if(length <= 1){
            return 0;
    }

    int middle = (length + 1) / 2;

    cout << length << endl << middle << endl << length - middle << endl;
    cout << endl;

    int *left = new int[middle];
    int *right = new int[length - middle];


    for(int i = 0; i < middle; i ++)left[i] = array[i];//error
    for(int i = middle; i < length; i ++)right[i] = array[i];//error

    return invCount(left, middle) + invCount(right, length - middle
    ) + merge(array, left, middle, right, length - middle);
}

int merge(int* array, int* left, int leftLength, int* right, int rightLength){
   int i = 0, j = 0, count = 0;

   while(i < leftLength || j < rightLength){
       if(i == leftLength){
           array[i + j] = right[j];
           j ++;
       }
       else if(j == rightLength){
           array[i + j] = left[i];
           i ++;
       }
       else if (left[i] <= right[j]){
           array[i + j] = left[i];
           i ++;
       }
       else {
           array[i + j] = right[j];
           j ++;
           count += leftLength - i;
       }
   }
   delete[] left;
   delete[] right;
   return count;
}
4

1 に答える 1

2
int *right = new int[length - middle];
...
for(int i = middle; i < length; i ++)
   right[i] = array[i];//error

あなたは の終わりをはるかに超えて書いていますright

: を関数 (境界チェックを行う)std::vectorと共に使用することをお勧めします。at()

「ヒープが失われた」についての質問については(メモリリークについて質問していると思います...)あなたのコードは大丈夫だと思いますが、スタイルが悪いだけです:leftそしてright、それらを割り当てたのと同じ関数で削除する必要があります。よりもmerge。いずれにせよ、例外がスローされるとメモリ リークが発生します。これは、 std::vector.

于 2013-03-05T12:55:35.667 に答える