pyscripter 689 Posted June 13 (edited) The following console app works fine: {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, System.Generics.Collections; type TMethodList = TList<TMethod>; const Method: TMethod = (Code:nil; Data:nil); begin try var fKeyDownChain := TMethodList.Create; try fKeyDownChain.Add(Method); fKeyDownChain.Remove(Method); WriteLn(fKeyDownChain.Count); finally fKeyDownChain.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; ReadLn; end. However the exact same sequence results in an access violation when used in a larger Win64 application. const Method: TMethod = (Code:nil; Data:nil); begin fKeyDownChain := TMethodList.Create; fKeyDownChain.Add(Method); fKeyDownChain.Remove(Method); The error occurs when you call Remove, at the first statement of the following function of System.Generics.Defaults, class function TComparer<T>.EQOperCompare(Self: Pointer; const Left, Right: T): Integer; begin if TRecEqualityOperator<T>(_GetExtInstanceData(Self, 0))(Left, Right) then Result := 0 else Result := BinaryCompare(@Left, @Right, SizeOf(T)); end; In the console application this statement results in a call to TMethod.Equal, Any clues as to why the error occurs? Update: This is a consequence of [RSP-43423] Using {$WEAKLINKRTTI ON} causes access violation on TList<T>.IndexOf method - Embarcadero Technologies. The console application also fails with {$WEAKLINKRTTI ON}. I guess specifying a Comparer would be a workaround. Is there any other workaround apart from removing the WEAKLINKRTTI directive, which increases the size of the executable by 2Mb? . Beyond the executable size, this is quite a serious issue, because it makes the use of generic collections of records in components unsafe, since a user of such a component setting WEAKLINKRTTI to ON, could face unpredictable and hard to detect crashes. Edited June 13 by pyscripter 1 Share this post Link to post