Обнаружено повреждение кучи в C ++ - PullRequest
0 голосов
/ 27 августа 2018

Вот мой код:

#include<iostream>
#include<cstdlib>

using namespace std;

int main() {
    int** arr=NULL;
    int num=0;
    cin >> num;
    int* big=NULL;
    arr = new int*[num];
    for (int i = 0; i < num; i++) {
        arr[i] = new int[5];
    }
    big = new int[num];

    for (int i = 0; i < num; i++) {
        for (int j = 0; j < 5; j++) {
            while (1) {
                cin >> arr[i][j];
                if (arr[i][j] >= 0 && arr[i][j] < 100)
                    break;
            }
        }
    }

    for (int i = 0; i < 5; i++) {
        big[i] = 0;
    }

    for (int i = 0; i < num; i++) {
        for (int j = 0; j < 5; j++) {
            if (big[i] < arr[i][j]) {
                big[i] = arr[i][j];
            }
        }
    }

    for (int i = 0; i < num; i++) {
        cout << "Case #" << i + 1 << ": " << big[i] << endl;
    }

    delete[]big;
    for (int i = num-1; i>=0; i--) {
        delete[]arr[i];
    }
    delete[]arr;

    return 0;
}

Когда я запускаю этот код, он говорит, что произошла ошибка повреждения кучи (обнаружено повреждение кучи).Я думаю, это означает, что в моих кодах есть некоторые ошибки в «новых» или «удаленных» частях, но я не могу их найти.Я надеюсь, что кто-то ответит.Благодарю.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Ошибка здесь:

big = new int[num];
...
for (int i = 0; i < 5; i++) {
    big[i] = 0;
}

Поэтому, когда у вас num меньше 5, вы пишете вне массива.

В любом случае вы используете C ++, поэтому используйте вектор для таких задач.

#include<iostream>
#include<cstdlib>
#include<vector>

using namespace std;

int main() {
    vector<vector<int>> arr;
    int num=0;
    cin >> num;
    arr.resize(num, vector<int>(5));

    for (auto &row : arr) {
        for (auto &cell : row) {
            while (1) {
                cin >> cell ;
                if (cell >= 0 && cell < 100)
                    break;
            }
        }
    }

    vector<int> big(arr.size());
    for (int i = 0; i < arr.size(); i++) {
        for (auto &cell : arr[i]) {
            if (big[i] < cell) {
                big[i] = cell;
            }
        }
    }

    for (int i = 0; i < num; i++) {
        cout << "Case #" << i + 1 << ": " << big[i] << endl;
    }

    return 0;
}
0 голосов
/ 27 августа 2018

Во многих местах вашего кода вы индексируете свой массив big, используя индексы от 0 до 5, в то время как массив выделяется с помощью пользовательского ввода, например, если пользовательский ввод был 4, ваш код не определен.

Если вы используете c ++, вам не нужно выделять массивы вручную, используйте std::vector, вместо этого он позаботится об управлении памятью, поэтому вам не нужно newи delete память самостоятельно.

С std::vector ваш код будет выглядеть примерно так.

std::vector<std::vector<int>> arr;
std::vector<int> big;
cin>>num;
arr.resize(num, std::vector<int>(5));
big.resize(5);

Вы также сможете использовать at метод для доступа к элементам, покапроверка границ и метод size для получения количества элементов массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...