Необъяснимый malloc.c: 2401: sysmalloc: Ошибка подтверждения - PullRequest
0 голосов
/ 16 ноября 2018

Я призываю вас выяснить, что, черт возьми, вызывает моя программа, я пытался найти причину этого, но я не смог найти ни малейшего кусочка.

МойПредполагается, что программа читает значения из файла и в зависимости от того, что она читает, создает 2 матрицы: первое значение в файле - это строки, а второе - столбцы.(Тогда он должен делать некоторые алгоритмы, но он работает просто отлично, до этого он не работал)

Так вот моя проблема: я продолжаю получать следующее сообщение об ошибке при запуске программы только , когда значение строки равно 30. Мне не удалось найти ни одного значения, которое приводит к этому сбою, кроме 30. Я хочу это исправить, но не могу найти причину сбоя программы с самого началаЯ не знаю, что еще попробовать.Я отладил его, и программа перестала работать при создании первой матрицы после прочтения всей информации из файла.

    potter: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

Самое смешное, что программа работала просто отлично перед добавлением последней функции.Я, должно быть, что-то изменил, не заметив и не сломав программу (у меня нет более старых версий, и удаление функции не помогает)

Вот ссылка на код дыры и тестовые файлы, если кому-то интересно:https://drive.google.com/open?id=1tcKXainj021fwjAAGN3cNdsU50p2Neou

Редактировать: Сбой программы в следующей части кода

M=new int * [n+1]                  
        if(M){                             
                for(int i=0; i<=n;i++){       
                        M[i]=new int [T+1];   
                        if(!M[i]){       
                                cerr<<"Error";
                                exit(-1);
                        }
                }
                for(int i=0;i<n+1;i++)
                        for(int j=0;j<T+1;j++)
                                M[i][j]=-1;
        }else{
                cerr<<"Error";
                exit(-1);
        }

Конкретно при попытке сделать M [i] = new int [T + 1];когда я = 10 только , если n = 30


Решено

Проблема заключалась в том, что цикл выходил за пределы выделенной памяти, предварительно повреждая ее и вызывая сбой программыпотом.

 decisions=new int [n];
                for(int i=0;i<=n;i++)
                        decisions[i]=0;

Честно говоря, я не знаю, как программа провалилась, сделав что-то подобное.(Это было легко решено путем замены n на n + 1 в решениях = new int [n + 1];)

1 Ответ

0 голосов
/ 16 ноября 2018

Очень вероятно, что вы сделали что-то, что повредило структуру данных malloc. Это может быть из-за повторного использования освобожденного указателя, превышения выделенных вами данных (и, таким образом, затирания маленького заголовка, который использует malloc) или случайного освобождения указателя, который не указывает на заголовок неправильно распределенных данных.

Существует прекрасный инструмент под названием valgrind , который очень полезен для такого рода вещей.

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