@BigWings sim, o TDetCollection dispara o AV da mesma forma. Veja o projeto de exemplo em anexo.
Na minha interpretação, a semântica do método Assign é de Copiar e não de Mover.
Conforme consta na documentação do Freepascal:
"Assign copies the contents of Source to Self, if the classes of the destination and source classes are compatible."
E da embarcadero:
"Copies the contents of another, similar object."
Sim, as documentações falam do método Assign da classe TPersistent mas não estou me referindo a implementação e sim a semântica.
Exemplo que dispara o AV:
program Project1;
{$APPTYPE CONSOLE}
uses
//FastMM4,
SysUtils,
pcnNFe;
var
Det1, Det2: TDetCollection;
begin
Det1 := TDetCollection.Create;
Det2 := TDetCollection.Create;
Det1.New;
Det2.Assign(Det1); // Move algumas referências, quando na verdade deveria copiar.
WriteLn('Liberando Det1');
Det1.Free;
WriteLn('Liberando Det1');
Det2.Free; // <- Access Violation
WriteLn('Fim');
end.
Project1.dpr