2011-09-29 11 views
7

Praca nad projektem wykorzystującym fabryki do konstruowania obiektów. Zachowuję wskaźniki do funkcji fabrycznych w warach na całym świecie (nie wiem jakie) i rejestruję je podczas inicjalizacji.Delphi Memory Issue (FastMM4)

Ostatnio zainteresowałem się tym, czy projekt miał wycieki pamięci, więc postanowiłem pobrać FastMM4 i przejrzeć. Wpadłem na kilka błędów, które mogłem naprawić, ale ten jestem trochę zdumiony, wydaje mi się, że nie zwalniam pamięci związanej z fabryką, jak pokazano w poniższym kodzie. Dostaję mały przeciek pamięci. Nie jest to jednak śmieszne, ale denerwujące.

Co by użyć do uwolnienia pamięci (jeśli jest to) Próbowałem dispose (@factoryfunction), ale wydaje się, że wszystko. Nie jestem zbyt dobry w kwestii wskaźnika na niskim poziomie, zawsze mnie to drażni, więc jeśli ktoś mógłby pomóc, to byłoby wspaniale.

Podałem przykład poniżej, który właśnie napisałem z mojej głowy, który ilustruje problem, który mam.

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

Jestem ciekawy - dlaczego używasz "odniesienia do funkcji" zamiast prostego typu funkcji? Zapobiegłoby to wyciekowi pamięci, ponieważ nie wymagałoby to kompilatora przeskakującego przez obręcze, aby osiągnąć to, co można łatwiej osiągnąć. Czy jest to jeden z tych przypadków, w których uproszczony przykład nie odzwierciedla w pełni oryginalnego scenariusza? – Deltics

+0

podobnie jak względna luźność pisania za pomocą tego, więc zmienna może przyjmować procedury, metody lub metody anonimowe. Jest używany w ramach, więc chcesz uczynić go jak najbardziej rozszerzalnym. – Barry

+0

Nie jestem pewien, czy to osiąga, prawda? Odniesienie nadal musi być funkcją odpowiedniego podpisu, nie? Jeśli nie, to powiedziałbym, że jest to powód, aby unikać takich rzeczy jak dżuma! jeśli zadeklaruję typ jako funkcję o pewnej sygnaturze, to lepiej, żeby był lepiej używany jako taki. Coś jeszcze prosi o ból głowy związany z utrzymaniem (nie mówiąc o dezorientacji). I pozostaje pytanie, dlaczego chcesz pozwolić na tę elastyczność, z wyjątkiem tego, że możesz/chcesz? W jakim celu elastyczność może mieć zastosowanie w Twojej strukturze? – Deltics

Odpowiedz

5

Właśnie przetestowane w Delphi 2010 i wydaje się być błąd. Kompilator powinien wygenerować kod, aby to wyczyścić, ale tak nie jest. Nawet pisanie FactoryFunction := nil, jak sugerował David, nie działa.

Powinieneś zgłosić ten fakt w QC jako błąd.

+0

Wydaje się, że istnieje dodatkowe wywołanie funkcji 'IntfCopy', w wyniku której licznik odwołań ma wartość 2. Nie ma pojęcia, dlaczego tak się dzieje. –