2010-11-18 35 views
3

J'ai vu beaucoup de mentions de bogues dans les génériques de Delphi 2009, mais je ne m'attendais jamais à quelque chose d'aussi basique dans la mise à jour 3, pas moins. Appel IndexOf sur un TList générique ou TObjectList provoque une violation d'accès si la liste contient 1 ou plusieurs éléments:Générique TList <> dans Delphi 2009 planter sur IndexOf

type 
    TTest = class(TObject); 

procedure DoTest; 
var 
    list : TObjectList<TTest>; 
    t : TTest; 
begin 
    list := TObjectList<TTest>.Create; 
    try 
    t := TTest.Create; 
    list.IndexOf(t); // No items in list, correct result -1 
    list.Add(t); 
    list.IndexOf(t); // Access violation here 
    finally 
    list.Free; 
    end; 
end; 

L'exception est « EAccessViolation: violation d'accès à l'adresse 0048974C dans le module « testbed.exe » Lire d'adresse. 00000000"

Compiler avec débogage DCU conduit à un problème dans Generics.Collections.pas - le membre FComparer n'est pas affecté:

function TList<T>.IndexOf(const Value: T): Integer; 
var 
    i: Integer; 
begin 
    for i := 0 to Count - 1 do 
    if FComparer.Compare(FItems[i], Value) = 0 then 
     Exit(i); 
    Result := -1; 
end; 

Bien sûr, rend le TList générique presque complètement inutile. Puisque la mise à jour 3 ne semble pas avoir corrigé ce bug, ai-je un recours autre que la mise à niveau vers XE?

Répondre

5

Ceci est un bug dans le constructeur par défaut de TObjectList<T>, et je pensais qu'il a été corrigé dans la mise à jour 3. Si vous le voyez encore, utilisez un autre constructeur ou mettez à jour vers D2010 ou XE, où il est définitivement corrigé. (Et vous voudrez vraiment quitter D2009 si vous voulez quand même travailler avec des génériques.)

+2

+1 pour « vous aurez vraiment envie de descendre de D2009 si vous voulez travailler avec les génériques de toute façon ». Je suis toujours sur D2009 et j'ai eu beaucoup de problèmes à essayer de les utiliser. Il y a trop de choses qui devraient fonctionner mais pas. – lkessler

+3

Je sais, je sais :) Mais le prix de la mise à niveau de XE n'est pas un changement de poche pour un amateur. J'utilise beaucoup TObjectList et espérais juste que les génériques me permettraient d'éviter la constante typecasting. Je ne m'attendais vraiment pas à ce que les problèmes fassent surface aussi tôt. –