2012-10-31 1 views
5

Sto usando Delphi XE. Mi sono imbattuto in un problema di perdita di memoria usando Delphi Soap. Si scopre di essere a causa di una chiamata .Trasporto mancante nella TWSDLLookup.Destroy, come descritto nella QC 91160Perdita di memoria Delphi XE nel metodo TWSDLLookup.Destroy

Il problema che ho è il descritto work-around, che è semplicemente aggiungere FLookup.Free al metodo TWSDLLookup.Destroy.
Non voglio modificare la sorgente Delphi, quindi ho provato a copiare l'unità nella cartella del mio progetto, apportando la modifica e la ricompilazione, come descritto nella risposta di Tom here. Il problema con questa tecnica è che apparentemente funziona solo se ricompilate anche tutte le unità dipendenti. Ho provato a copiare solo WSDLLookup.pas nella directory del mio progetto e ottengo un errore StackOverflow. Non ho familiarità con Web Services/SOAP, quindi non so quali altre unità dovrei copiare se uso questa tecnica.

La risposta di Rob Kennedy nella stessa pagina descrive una tecnica diversa che coinvolge l'aggancio del codice, ma non sembra applicabile ai metodi dell'oggetto. Ho fatto come suggerisce e ho scaricato il codice gratuito per i controlli Unicode TNT e ho individuato le procedure pertinenti, ma non sono riuscito a trovare informazioni su come collegare i metodi di un oggetto, se questo è possibile. Se potessi fare questo, allora agganciare TWSDLLookup.Destroy e aggiungere la chiamata FLookup.Free.

Tutte le idee su come risolvere questo problema saranno molto apprezzate. Sono un po 'un programmatore novizio quindi spero di aver perso qualcosa di ovvio?

risposta

3

Quello che stai cercando di fare in effetti funziona bene. L'ho provato da solo. Ecco il file di progetto che ho usato:

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

Ho fatto una copia del file WSDLLookup.pas e lo mise nella stessa directory del file .dpr. Quindi, nella copia anziché nell'originale, ho modificato TWSDLLookup.Destroy.

destructor TWSDLLookup.Destroy; 
begin 
    Beep; 
    ClearWSDLLookup; 
    FLookup.Free; 
    inherited; 
end; 

ho aggiunto il Beep per dimostrare a me stesso che questo codice è stato effettivamente in esecuzione.

Nella tua posizione, utilizzerei sicuramente questa soluzione invece di provare i hook del codice. E naturalmente l'altra soluzione semplice è l'aggiornamento a una versione successiva di Delphi.

Una cosa a cui fare attenzione è ricordare di rimuovere l'unità modificata quando si esegue l'aggiornamento. La perdita è stata risolta in XE2.

+0

Grazie per la rapida risposta :) –

+0

Ho visto qualcosa su questo, forse l'uso di debug dcus potrebbe causare un problema - forse è per questo che ottengo il mio stack overflow. O forse ho un altro bug. –

+0

Comunque, grazie ancora. Dal momento che funziona, cercherò di scoprire cos'altro sto facendo male :) –