Strange ocurrencia EListError (cuando se accede a índice variable definida)

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

  •  21-09-2019
  •  | 
  •  

Pregunta

Tengo un TList que almacena algunos objetos. Ahora tengo una función que hace algunas operaciones en esa lista:

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;

Ahora, lo que es realmente extraño es que el acceso a fMgr.Windows con cualquier índice adecuado provoca EListError ... Sin embargo, si i difícil que el código (en el ejemplo, sustituya AIndex con valor 0 o 1) funciona bien. He intentado depurarlo, la función se llama dos veces, con argumentos 0 y 1 (como se suponía).

mientras AIndex = 0, evaluando fMgr.Windows [AIndex] resultados en EListError en $ someAddress, mientras que la evaluación fMgr.Windws [0] en lugar - devuelve resultados adecuados ...

lo que es aún más extraño, a pesar de que hay un EListError, la función devuelve datos adecuada ... y no muestra nada. Sólo información sobre dos pérdidas de memoria EListError al cerrar el sistema (utilizando FastMM)

alguna idea de lo que podría estar mal?!

Gracias de antemano Michal

¿Fue útil?

Solución

Creo que sólo está confundiendo el depurador de alguna manera. A veces "limpia", el código libre de fugas parece generar una pérdida de memoria si hay un reloj mirando una propiedad, y la evaluación de ese reloj provoca una excepción. Estos no se muestran a al IDE que son manejados por el depurador.

Un caso en el que esto puede ocurrir es si usted tiene un depurador mostrando fMgr.Windows [AIndex] antes Aindex se intialised, o un reloj en fMgr.Windows [0] antes de que haya elementos de la lista.

Otros consejos

No hay ninguna razón para que lance una EListError si el índice es correcto. Si se produce una excepción, no hay razón para que no muestra y todavía devuelve resultados normales.

Por desgracia, es difícil ver cuál es el problema con esta poca información por lo que sólo puede adivinar:

Tal vez usted está teniendo problemas de múltiples subprocesos? Tal vez la excepción no son lanzados, pero depurador no se detiene en los puntos de ruptura? Tal vez la fuga no es de este código? Tal vez se trata de un informe falso de fugas? Tal vez fMgr hace referencia a algo diferente? Tal vez los hechos son diferentes?

Usted podría intentar encender más información de depuración y tienen callstacks informe FastMM o usted podría intentar compilar con Depuración DCU y rastrear en el código TList. Y asegúrese de que Delphi se detiene en todas las excepciones. Tal vez que le ayudará en la búsqueda de su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top