Setlength(AArray,0);
Finalize(AArray); // <---
Dass ist doppel: double free. Beide machen dasselbe.
Warum überhaupt freigeben (beide versionen)? Am Ende der Procedure ist es doch sowiso weg.
Auch würde ich nie auf die Idee kommen "AArray:=nil;" zu verwenden