2011-07-01 13 views
7

Mam listę TObject (FileEventObjects := TObjectList.Create(True);) zawierającą jeden lub więcej obiektów. Obiekty muszą pozostać na liście, dopóki nie zostaną przetworzone. (Lista obiektów istnieje przez czas trwania aplikacji.)Delphi Usuwanie obiektu z TObjectList

Nie jestem do końca pewien, jak usunąć przetworzony obiekt z listy.

Czy obiekt będzie „uwolniony” czy robię FileEventObjects.Delete(i)

Czy istnieją jakieś linki do przydatnych przykładów TObjectLists w akcji?

Pozdrawiam, Pieter.

+1

Jeśli kiedykolwiek ciekawy, jeśli obiekt jest uzyskiwanie uwolniony, dodaj tę linię do destruktora: OutputDebugString ("Uwolnienie TMyclassName"); Zobaczysz go w dzienniku zdarzeń za każdym razem, gdy zostanie wywołany. Lub ustaw punkt przerwania w TMyclassName.Destroy. Możesz nawet włączyć wykrywacz nieszczelności pamięci Fast MM, a otrzymasz ostrzeżenie o obiektach, które nie zostały poprawnie uwolnione. –

Odpowiedz

12

Jeśli zdasz True do konstruktora TObjectList (jest również True domyślnie), lista uwalnia dowolny obiekt jak najszybciej usunąć je z kolekcji, bez względu na to, czy używasz Delete, Remove lub Clear.

Poza tym TObjectList może być używany podobnie jak TList.

+0

Bałem się odpowiedzieć na to pytanie, ponieważ nie wiedziałem, czy uwolniło go, gdy używasz tych funków. Dzięki za wyczyszczenie, +1 :) – Jeff

+15

Możesz użyć '.Extract()', aby usunąć obiekt z listy bez zwalniania go. –

+0

Dziękuję za szybką odpowiedź. –

4

zawsze pamiętać pętli wstecz jak

for i := Pred(objectlist.Count) downto 0 do 
begin 
    objectlist.items[i].process; 
    objectlist.delete(i); 
end; 

jeśli pętla od 0 do -1 liczyć podczas usuwania elementów dostaniesz naruszeń dostępu

+2

Tak, znalazłem to na własnej skórze wczoraj !! –

Powiązane problemy