2012-10-31 10 views
5

Używam Delphi XE. Natknąłem się na problem z wyciekiem pamięci przy użyciu mydła Delphi. Okazuje się, że z powodu braku .Free rozmowy w TWSDLLookup.Destroy, jak opisano w QC 91160Delphi XE wyciek pamięci w metodzie TWSDLLookup.Destroy

Problem, który mam jest opisany obejście, które jest po prostu dodać FLookup.Free metody TWSDLLookup.Destroy.
Nie chcę zmieniać źródła Delphi, więc próbowałem skopiować jednostkę do mojego folderu projektu, dokonując zmiany i rekompilacji, zgodnie z opisem w odpowiedzi Toma podanym jako here. Problem z tą techniką polega na tym, że najwyraźniej działa tylko wtedy, gdy przekompilujesz wszystkie zależne jednostki. Próbowałem skopiować tylko WSDLLookup.pas do mojego katalogu projektu i pojawia się błąd Stackoverflow. Nie jestem zaznajomiony z usługami sieciowymi/SOAP, więc nie wiem, jakie inne jednostki powinienem skopiować, jeśli użyję tej techniki.

Odpowiedź Rob Kennedy'ego na tej samej stronie opisuje inną technikę związaną z zaszywaniem kodu - ale wydaje się, że nie dotyczy ona metod obiektowych. Zrobiłem tak, jak sugerował i pobrałem darmowy kod do kontroli TNT Unicode i zlokalizowałem odpowiednie procedury, ale nie byłem w stanie znaleźć informacji o tym, jak zahaczyć metody obiektu - jeśli rzeczywiście jest to możliwe. Gdybym mógł to zrobić, wtedy podłączyłem TWSDLLookup.Destroy i dodałem wywołanie FLookup.Free.

Wszelkie pomysły na rozwiązanie tego problemu będą mile widziane. Jestem trochę początkującym programistą, więc mam nadzieję, że przegapiłem coś oczywistego?

Odpowiedz

3

To, co próbujesz zrobić, działa dobrze. Sam to przetestowałem. Poniżej znajduje się plik projektu użyłem:

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

Zrobiłem kopię pliku WSDLLookup.pas i umieścił go w tym samym katalogu co plik .dpr. Następnie, w kopii, a nie w oryginale, zmodyfikowałem TWSDLLookup.Destroy.

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

dodałem Beep udowodnić sobie, że kod ten został faktycznie wykonywane.

W twoim położeniu zdecydowanie użyłbym tego rozwiązania zamiast próbować haków kodu. Oczywiście innym prostym rozwiązaniem jest aktualizacja do późniejszej wersji Delphi.

Należy pamiętać o konieczności usunięcia zmodyfikowanego urządzenia podczas aktualizacji. Wyciek został naprawiony w XE2.

+0

Dzięki za szybką odpowiedź :) –

+0

Zobaczyłem coś o tym, że może użycie debugowania dcus spowodowałoby problem - być może właśnie dlatego mam przepełnienie stosu. A może mam inny błąd. –

+0

W każdym razie, dzięki jeszcze raz. Ponieważ to działa, spróbuję dowiedzieć się, co jeszcze robię źle :) –