2011-09-29 13 views
7

Lavorare su un progetto che utilizza le fabbriche per costruire oggetti. Tengo i puntatori alle funzioni di fabbrica su Vars globalmente (non so) e li registro sull'inizializzazione.Problema di memoria Delphi (FastMM4)

Recentemente ero interessato a vedere se il progetto aveva perdite di memoria, quindi ho deciso di scaricare FastMM4 e dare un'occhiata. È venuto fuori con alcuni errori che ho potuto risolvere ma questo mi sembra un po 'stordito sembra non liberare la memoria relativa alla fabbrica come mostrato nel codice qui sotto ho una piccola perdita di memoria. Non è ridicolo, ma comunque fastidioso.

Che cosa utilizzerei per liberare la memoria (se è così), ho provato a dispose (@factoryfunction) ma sembra maneggiare tutto. Non sono troppo bravo con la roba di puntatore di basso livello mi confonde sempre e quindi se qualcuno potesse aiutare sarebbe bello.

Ho incluso un esempio qui sotto che ho appena scritto in cima alla mia testa che illustra il problema che sto avendo.

Cheers,

Barry

unit Test; 

interface 

uses classes; 

type 

TAFactoryFunction = reference to function (const aType : integer): TObject; 

function testfunction (const aType : integer) : TObject; 

implementation 

function testfunction(const aType: integer) : TObject; 
begin 
    result := TObject.Create; 
end; 

var 
    FactoryFunction : TAFactoryFunction 

initialization 
    FactoryFunction := testfunction; 

finalization 
    // possibly some freemem code here? 

end. 
+0

Sono curioso: perché stai usando un "riferimento alla funzione" piuttosto che un semplice tipo di funzione? Ciò eviterebbe la perdita di memoria poiché non coinvolgerebbe il compilatore che salta attraverso i cerchi per ottenere ciò che può essere ottenuto più semplicemente. Oppure è uno di quei casi in cui l'esempio semplificato non riflette completamente lo scenario originale? – Deltics

+0

proprio come il relativo allentamento della digitazione con esso così la variabile può prendere procedure, metodi o metodi anonimi. Viene utilizzato per un framework in modo da renderlo il più estendibile possibile. – Barry

+0

Non sono sicuro che questo lo ottenga, vero? Il riferimento deve ancora essere una funzione della firma appropriata, no? In caso contrario, direi che è un motivo per evitare questo genere di cose come la peste !! se dichiaro un tipo come una funzione con una certa firma, allora è meglio che venga usato come tale. Qualcos'altro sta chiedendo un mal di testa di manutenzione (per non parlare della confusione). E la domanda rimane, perché vuoi consentire questa flessibilità, a parte il fatto che puoi/vuoi farlo? Che scopo ha la flessibilità nel tuo quadro? – Deltics

risposta

5

Ho appena testato questo in Delphi 2010 e sembra essere un bug. Il compilatore dovrebbe generare codice per ripulirlo, ma non lo è. Anche scrivere FactoryFunction := nil, come suggerito da David, non funziona.

Si dovrebbe segnalare questo in QC come un errore.

+0

Sembra esserci una chiamata extra a 'IntfCopy' che ha come risultato il conteggio dei riferimenti impostato su 2. Non ho idea del perché sia ​​così. –

Problemi correlati