O
overall
Здравствуйте. Вот такая вот фигня у меня. Уже третий день сижу мучаюсь не могу понять, где что не так.
Была процедура следующего вида:
Весь код не привожу, больно большой.
Разбил её на две, путем выноса из под цикла:
Вынес правильно.
В старой версии процедура рекурсивно вызывала саму себя.
После разбивки соответственно рекурсия сохранилась, но опосредованно (ReadItemsTo -> ReadItem -> ReadItemsTo -> ReadItem -> ...).
Компилится и работает, но в некоторых случаях
возникает AV (Access Violation) в процедуре "DeleteFree()" в "getmem.inc" (системный модуль).
Всё это определенно очень странно.
До разбития процедуры всё работало отлично без таких вот выкрутасов.
Может это баг компилятора? (Пробовал и на Delphi 5 и на Delphi 6 - и там и там таже самая ошибка)
Думаю, может что-то не так с выделением памяти, раз ошибка в DeleteFree (процедура стандартного менеджера памяти).
Руками память не выделяю. Только создание и уничтожение объектов, ну и строки (длинные).
Но если дело с памятью, то почему тогда всё отлично работает, когда процедура не разбита? Не понимаю...
Подскажите, что-нибудь, пожалуйста!
Была процедура следующего вида:
Весь код не привожу, больно большой.
Код:
procedure ReadItemsTo(...);
var
I: Integer;
begin
for I := 0 to ... do
begin
//Кусок кода #1
end;
end;
Разбил её на две, путем выноса из под цикла:
Код:
function ReadItem(...): ...;
begin
//Кусок кода #1
end;
procedure ReadItemsTo(...);
var
I: Integer;
begin
for I := 0 to ... do
begin
... := ReadItem(...);
end;
end;
Вынес правильно.
В старой версии процедура рекурсивно вызывала саму себя.
После разбивки соответственно рекурсия сохранилась, но опосредованно (ReadItemsTo -> ReadItem -> ReadItemsTo -> ReadItem -> ...).
Компилится и работает, но в некоторых случаях
возникает AV (Access Violation) в процедуре "DeleteFree()" в "getmem.inc" (системный модуль).
Код:
procedure DeleteFree(f: PFree);
var
n, p: PFree;
size: Integer;
begin
if rover = f then
rover := f.next;
n := f.next;
size := f.size;
if size <= cSmallSize then begin
if n = f then
smallTab[size div cAlign] := nil
else begin
smallTab[size div cAlign] := n;
p := f.prev;
n.prev := p;
p.next := n;
end;
end else begin
p := f.prev;
n.prev := p; // Здесь!!!
p.next := n;
end;
end;
Всё это определенно очень странно.
До разбития процедуры всё работало отлично без таких вот выкрутасов.
Может это баг компилятора? (Пробовал и на Delphi 5 и на Delphi 6 - и там и там таже самая ошибка)
Думаю, может что-то не так с выделением памяти, раз ошибка в DeleteFree (процедура стандартного менеджера памяти).
Руками память не выделяю. Только создание и уничтожение объектов, ну и строки (длинные).
Но если дело с памятью, то почему тогда всё отлично работает, когда процедура не разбита? Не понимаю...
Подскажите, что-нибудь, пожалуйста!