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針對對象和接口的釋放都貌似有些問題。