Ho avuto questo brutto bug che è scomparso in passato ma ora dopo un po 'di tempo è tornato.FastMM4 dice "L'intestazione del blocco è stata danneggiata"
Ho due oggetti TSam (derivati da TPersistent) creati e caricati in un oggetto TAsmJob (derivato da TObjectList).
In fase di esecuzione, un modulo crea un TStringGrid e quindi l'AsmJob che crea questi due oggetti SAM (e carica alcuni dati dal disco in ciascuno di essi). Anche AsmJob è assegnato alla griglia. Quando il modulo viene distrutto, Grid si prende cura di AsmJob liberandolo, il che libera gli oggetti TSam. Ecco il problema: il primo oggetto viene liberato senza problemi, ma il secondo muore quando viene chiamato il suo metodo ereditato (in Destroy destructor).
Uso FreeAndNil nell'intero programma per liberare gli oggetti. Gli oggetti TSam non sono NIL !!!!! Quindi, questo è il primo tentativo di liberare gli oggetti. Anche i dati all'interno degli oggetti sono coerenti.
La spina dorsale del programma si presenta così:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
Io davvero non capisco dove cerco di doppio libero o sovrascrivere l'oggetto dopo che è stato rilasciato.
edit:
Alcuni degli errori che ho ricevuto:
FastMM ha rilevato un errore durante l'operazione di scansione blocco libero. FastMM ha rilevato che un blocco è stato modificato dopo essere stato liberato.
FastMM ha rilevato un errore durante l'operazione di scansione a blocchi liberi . L'intestazione del blocco è stata danneggiata.
dettaglio:
The current thread ID is 0x19C, and the stack trace (return addresses) leading to this error is:
402E77 [System][@FreeMem]
4068DC [System][@DynArrayClear]
405E2D [System][@FinalizeArray]
405D31 [System][@FinalizeRecord]
40432F [System][TObject.CleanupInstance]
404272 [System][TObject.FreeInstance]
404641 [System][@ClassDestroy]
4D313E [UnitSam.pas][TSam.Destroy][297]
4042BF [System][TObject.Free]
4149ED [SysUtils][FreeAndNil]
4D9C0A [UnitAsmJob.pas][UnitAsmJob][TAsmJob.Destroy][180]
ho tutte le opzioni "debug" abilitati nella IDE, tra cui il "campo di controllo". Inoltre, FastMM4 è impostato sulla modalità di debug super aggressiva. Senza FastMM o al di fuori del debugger il programma gira bene, ma so che non significa che il bug non sia più lì. In realtà ha funzionato (probabilmente) per più di un anno, fino a quando non ho installato FastMM.
edit:
Grazie a tutti. No, mi sento che mi sto muovendo un po 'nella buona direzione.
La struttura del programma è più complicata. Ho offerto solo il backbone per mantenere il post originale di dimensioni ridotte. Ma che diamine, è già diventato più grande :) Quindi, quegli oggetti TSam sono usati per caricare i dati dal disco. Un file in ogni oggetto. Stanno facendo anche alcuni processi e la convalida dei dati. Per ciascuno di questi TSam ho anche un oggetto grafico che mostra sullo schermo (graficamente) i dati contenuti negli oggetti TSam. Ogni riga in TStringGrid mostra anche i dati in TSam, ma testualmente.
Una domanda che ho: se rompo il programma in pezzi più piccoli per scoprire dove si trova l'errore, l'errore apparirà ancora? O è possibile apparire solo in questa particolare configurazione?
risposta alla domanda "come fa l'AsmJob vengono assegnati a TStringGrid in modo che il TStringGrid distrugge l'AsmJob, ci puoi mostrare?"
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
poi da qualche parte nel TForm.Create (la forma che contiene la griglia), lo faccio
MyGrid.AsmJob=AsmJob;
e nel distruttore del MyGrid che faccio:
begin
FreeAndNil(AsmJob);
inherited
end;
Grazie Alessandro. Non avevo idea di "ScanMemoryPoolForCorruptions". Immagino sia una funzione offerta dalla DLL FastMM. Andrò a cercarlo al momento. – Ampere
Questa è la funzione di FastMM4.pas standard. È dalla versione standalone completa di FastMM. Non esiste nella versione di FastMM, che è integrata in Delphi. Non ci sono DLL in questione qui. Questa è solo una funzione nel solito file pas;) – Alex
Purtroppo il link è morto. Ma puoi accedervi al seguente indirizzo: http://web.archive.org/web/20091007162116/http://blog.eurekalog.com/?p=198 – EMBarbosa