Возможная проблема free () в моем алгоритме Дейкстры - PullRequest
1 голос
/ 29 мая 2011

Я использую Дейкстру, чтобы найти кратчайший путь для завершения определенной головоломки, где головоломка работает следующим образом.У вас есть пять цифр, которые могут быть в диапазоне от -4 до 4 (хотя они представлены по-разному, как "очень низкий / высокий" для -4/4, "низкий / высокий" для -3 до -1 или от 1 до 3и "завершено" для 0).Цель состоит в том, чтобы установить все пять на 0, используя 20 различных «техник», которые увеличивают / понижают значения шифра на заданную величину.Если метод изменяет один из цифр за пределами границ, то есть выше 4 или ниже -4, то вместо этого он ничего не делает.Итак, я представил его в виде графика, где узлами являются все возможные комбинации значений шифров, а начальным узлом является завершенный узел (0,0,0,0,0).Чтобы упростить задачу, я представляю шифры в виде значений от 0 до 8, где 4 является завершенным значением - это позволяет мне преобразовать их основание 9 в индексы массива графа, чтобы не тратить время на поиски.

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

Я не задавал здесь никаких вопросов, поэтому не знаю этикета - я 'Я собираюсь поместить весь источник здесь, потому что я не знаю, что является и не имеет отношения к данной конкретной ситуации, но это около 140 строк, что довольно много.При дальнейшем просмотре выясняется, что на самом деле нет тега или чего-либо еще, поэтому я просто покажу его на кодовой панели.

http://codepad.org/I0K0ETsU

Редактировать: Хорошо.Хорошо.Теперь я полностью запутался.Я решил просто закомментировать это для хихиканья - и ничего больше не идет не так.Он заканчивается, выплевывает output.txt, и текстовый файл выглядит совершенно корректно.Я не могу понять, что, черт возьми, не так с кодом, который заставил бы его развалиться на free (), когда больше ничего не случилось.

Ответы [ 3 ]

1 голос
/ 29 мая 2011

A free обычно завершается ошибкой только по нескольким причинам:

  • Попытка освободить указатель NULL
  • Попытка освободить что-то, что было бесплатным'd before (double free)
  • Попытка освободить что-то недопустимое (т. е. освободить адрес, который является мусором)
  • Повреждение памяти (область, в которой хранится информация о выделенном разделе, была переполнена)
1 голос
/ 29 мая 2011

После беглого просмотра похоже, что pool-> next инициализируется в temp, а в это время temp-> next не инициализируется.Поэтому, когда вы идете по списку temp-> next и пытаетесь освободить его, вы освобождаете неинициализированный указатель (или память, которой вы не владеете).

0 голосов
/ 09 декабря 2012

Оказывается, проблема была в том, что я не включил символ \ 0 в строку длины строки для malloc ().

...