天天看點

The Delphi Container Library (DCLX) 幾處BUG

function TStrIntfHashMap.Remove(const Key: string): IInterface;

var

  Bucket: PStrIntfBucket;

  I: Integer;

{$IFDEF THREADSAFE}

  CS: IInterface;

{$ENDIF}

begin

  CS := EnterCriticalSection;

  Result := nil;

  if Key = '' then

    Exit;

  Bucket := @(FBuckets[FHashFunction(HashString(Key))]);

  for I := 0 to Bucket.Count - 1 do

    if Bucket.Entries[I].Key = Key then

    begin

     //在Remove的時候僅僅隻是傳回了值,沒有把Bucket.Entries[i]中的Value值進行置空。

     Result := Bucket.Entries[I].Value;

     //add by mofen

     Bucket.Entries[I].Value := nil;

      System.Move(Bucket.Entries[I + 1], Bucket.Entries[I],

       (Bucket.Count - I) * SizeOf(TStrStrEntry));

      Dec(Bucket.Count);

      Exit;

    end;

end;

我看了所有的Remove針對對象和接口的釋放都貌似有些問題。

繼續閱讀