Странное возникновение ошибки EListError (при доступе к индексу, определяемому переменной)

StackOverflow https://stackoverflow.com/questions/1965857

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня есть TList, в котором хранятся некоторые объекты.Теперь у меня есть функция, которая выполняет некоторые операции над этим списком:

function SomeFunct(const AIndex: integer): IInterface
begin
if (AIndex > -1) and (AIndex < fMgr.Windows.Count ) then
  begin
    if (fMgr.Windows[AIndex] <> nil) then
      begin
        if not Supports(TForm(fMgr.Windows[AIndex]), IMyFormInterface, result) then
          result:= nil;
      end;
  end
else
  result:= nil;
end;

итак, что же такое действительно странно то, что доступ к fMgr.Windows с любым правильным индексом вызывает EListError...Однако, если я жестко запрограммирую его (например, заменю AIndex значением 0 или 1), он будет работать нормально.Я попытался отладить его, функция вызывается дважды, с аргументами 0 и 1 (как и предполагалось).

при AIndex = 0 вычисление fMgr.Windows[AIndex] приводит к ошибке EListError в $someAddress при вычислении fMgr.Вместо этого Windws[0] возвращает правильные результаты ...

что еще более странно, даже при наличии EListError функция возвращает правильные данные ...и ничего не показывает.Просто информация о двух утечках памяти EListError при завершении работы (с использованием FastMM)

есть какие-нибудь идеи, что может быть не так?!

Заранее спасибо михал

Это было полезно?

Решение

Я думаю, вы просто каким-то образом сбиваете с толку отладчик.Иногда "чистый" код без утечек, по-видимому, приводит к утечке памяти, если есть часы, просматривающие свойство, и оценка этого часов вызывает исключение.Они не отображаются в IDE, они обрабатываются отладчиком.

Это может произойти, если у вас есть отладчик, показывающий fMgr.Windows[AIndex] перед инициализацией Aindex, или просмотр fMgr.Windows[0] перед появлением каких-либо элементов в списке.

Другие советы

У него нет причин выбрасывать EListError, если индекс правильный.Если генерируется исключение, нет никаких причин для того, чтобы оно не отображалось и по-прежнему возвращало нормальные результаты.

К сожалению, трудно понять, в чем проблема с этой небольшой информацией, поэтому я могу только догадываться:

Может быть, у вас возникли проблемы с многопоточностью?Может быть, исключение действительно генерируется, но отладчик не останавливается на точках останова?Может быть, утечка происходит не из этого кода?Может быть, это ложное сообщение об утечке?Может быть, fMgr ссылается на что-то другое?Может быть, факты другие?

Вы могли бы попробовать включить больше отладочной информации и заставить FastMM сообщать о стеках вызовов, или вы могли бы попробовать скомпилировать с помощью Debug DCU и выполнить трассировку в коде TList.И убедитесь, что Delphi останавливается на всех исключениях.Возможно, это поможет в поиске вашей проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top