Objectowych watpliwosci czesc kolejna (Referencja)

0

witam

Mam watpliwosci czy dobrze rozumiem zasade dzialania referencji do obiektow.
Jesli ktos jest w stanie potwierdzic slusznosc mojego wnioskowania to bardzo prosze
o odpowiedz. A jesli pisze glupoty to tym bardziej prosze o poprawienie mnie.

Niektore komponenty (TListbox, TStringGrid itp) maja takie pola jak Objects[].
Rozumiem ze jest tam przechowywana referencja do obiektu znajdujacego sie gdzies w pamieci.

Z tego wynika, ze jesli zniszcze ten komponent to obiekty z pol Objects[] pozostana nienaruszone.
Wiec jelsi zrobie cos takiego:

Listbox1.items.objects[0] := TJakisObiekt.create;
Listbox1.free;

to zgodnie z wczesniejszym rozumowaniem, zostanie mi w pamieci obiekt, do ktorego nie bede mial dostepu.
(Tu mam watpliwosci czy aby na pewno. Moze zostanie zniszczony razem z Listboxem???)

PYTANIE DODATKOWE:
Czy taki obiekt ktory zostal w pamieci, zostanie zniszczony przy zamykaniu programu?
(zakladam ze nie ma on zadnego Owner'a) Czy moze zostanie w pamieci do wylaczenia komputera?

0

W destruktorze klasy TListBox jest funkcja niszcząca te obiekty. A wygląda tak:

destructor TCustomListBox.Destroy;
begin
  FCanvas.Free;
  FItems.Free;
  FSaveItems.Free;
  inherited Destroy;
end;

tutaj właściwość items jest zwalniana (kasowana) z pamięci.

0

Obiekt klasy TJakisObiekt nie jest dealokowany razem z Listbox1. Musisz to zrobić samemu. Jeśli w Listbox1 miałeś jedyną referencję do niego, tracisz taką możliwość, a pamięć w ramach procesu wciąż jest zajęta.

Alokacja obiektów jest dokonywana na stercie. Jeśli obiekt nie został zdealokowany do zakończenia aplikacji, to (teoretycznie) system zwalnia pamięć po stercie programu, a więc i pamięć po obiekcie. Piszę teoretycznie, ponieważ niektóre wersje Windows (9x bez poprawek) potrafiły takiej pamięci nie zwolnić!

Dodatkowo, jeśli jest to pamięć w jakikolwiek sposób globalna, a nie lokalna procesu, Ty musisz zadbać o zwolnienie.

Podsumowując: niszczenie obiektów zawsze należy do prawidłowych i popularnych praktyk programistycznych ;)

//@up - Items to lista elementów: zwalniana jest lista, a nie elementy, do który referencje są w niej zawarte.

0
Szczawik napisał(a)

Piszę teoretycznie, ponieważ niektóre wersje Windows (9x bez poprawek) potrafiły takiej pamięci nie zwolnić!
Nie przesadzaj, ile to lat temu było !

0

Ja bym jednak byl ostrozny z tym zwalnianiem. Generalnie jak sie powinno (a w delphi tak jest, no moze poza interfejsami) zwolnic pamiec, to powinno sie ja zwolnic.

Nie pamietam juz dokladnie jak (i nie chce mi sie tego szukac - ale wlasnie bazowal na listach (TStringList)) ale napisalem kiedys program, ktory tak mieszal (czyt. gubil wskaznik), ze po zakonczeniu pozostawalo sporo pamieci niezwolnionej.

Generalnie jak jest mozliwosc zwolnienia to sie ja powinno stosowac a nie liczyc na system.

0
adf88 napisał(a)
Szczawik napisał(a)

Piszę teoretycznie, ponieważ niektóre wersje Windows (9x bez poprawek) potrafiły takiej pamięci nie zwolnić!
Nie przesadzaj, ile to lat temu było !

Wcale nie tak dawno - wiele firm wciąż na Windows 98 siedzi; niestety.

0

Jeżeli chodzi o Delphi to ma swój manager pamięci i jeżeli całą używana pamięć alokowana jest przez ten że manager to przy zamknięciu aplikacji takie zasoby są zwalniane. Tak się dzieje na pewno w programach napisanych w TurboDelphi.

ReportMemoryLeaksOnShutdown:= True;

Powyższa linijka pozwoli wykryć wszystkie niezwolnione zasoby.

Jeżeli chodzi o pamięć alokowaną przez funkcje systemowe to niestety jeżeli się tego nie zwolni to ten blok jest skazany na decyzje systemu Windows(niestety nieznam szczegółów)

0
Szczawik napisał(a)

Wcale nie tak dawno - wiele firm wciąż na Windows 98 siedzi; niestety.
98 owszem, zaktualizowany całkiem całkiem sobie radzi i większość najnowszych programów jest kompatybilna z 98. Nawet samemu instaluje 98 u ojca na PII (żeby internetu mógł sobie poużywać i w pasjansa zagrać :) ) Natomiast 95 to już na pewno nie są nigdzie używane, jakieś naprawdę sporadyczne przypadki. Wydaję mi się, że prędzej znajdziesz komputer z DOSem niż z 95 (u mnie na uczelni takie stoją w pracowni fizycznej, służą do drukowania wykresów na drukarce igłowej i każdy musiał z nich korzystać, żenada, jak się pomyliłeś przy wpisywaniu n-tej danej to lipa, od nowa !).

Nie mniej jednak żelazna zasada obowiązuje - twórca obiektu go niszczy.
Inaczej sprawa wygląda z odśmiecaczem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1