Das Problem ist der Aufruf an ProtectBuffer hier:
Delphi-Quellcode:
procedure TDECPasswordHash.DoDone;
begin
inherited;
ProtectBuffer(FSalt, SizeOf(FSalt));
SetLength(FSalt, 0);
end;
Du übergibst FSalt statt FSalt[0] und machst damit das Array kaputt. Da danach die Längenangabe des Arrays 0 ist, wird auch nichts mehr freigegeben.