Задать вопрос
@prmji

Удаление вспомогательного указателя при создании двусвязного списка приводит к ошибке. Почему?

program samukaz2;

type
    ListPointer = ^list;

    list = record
               pNext: ListPointer;
               pPrev: ListPointer;
               data: byte;
           end;


var
    first, ends, tmp: ListPointer;

    i : byte;

begin

    first := nil;

    for i:=1 to 10 do
    begin

        if first = nil then
            begin
                new(tmp);

                tmp^.data := i;
                tmp^.pPrev := nil;
                tmp^.pNext := nil;

                first := tmp;
                ends := tmp;

                continue;

            end;

        new(tmp);
        tmp^.data := i;
        tmp^.pNext := nil;

        ends^.pNext := tmp;

        ends := tmp;

    end;

    tmp := first;

    repeat
        writeln(tmp^.data);
        tmp := tmp^.pNext;
    until tmp = nil;

end.


Если в if'е после присвоения last и ends к tmp удалить его путём dispose(tmp); и тоже самое делать каждый раз после того как ends присваивается новое значение то код приводит к ошибке

10
56
Runtime error 216 at $00000000004011C7
  $00000000004011C7
  $0000000000422FEC


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

Компилятор FreePascal 3.2.2
  • Вопрос задан
  • 41 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@prmji Автор вопроса
Подумав, пришёл к выводу что при удалении указателя в FreePascal он не удаляется, удаляется(освобождается) область памяти на которую он указывал, причём его значение не меняется а продолжает указывать на теперь уже не доступную область памяти. Однако вопрос откуда взялись 10 и 56 остаётся открытым.
Ответ написан
Комментировать
@kalapanga
В коде в принципе написано что-то странное. Если я правильно понимаю, Вы хотите создать цепочку из 10 элементов, последовательно ссылающихся один на другого или что-то типа того. Но используете для этого только две переменные - first и ends, плюс ещё одну временную - tmp. А где же эти 10 элементов всё это время существуют? Кто выделенную под них память держит? Никто! То, что у Вас в таком виде (без dispose) программа выдаёт нечто осмысленное - это чистая случайность.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы