Autor Téma: Embarcadero príklad  (Přečteno 447 krát)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 443
  • Karma: 5
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Embarcadero príklad
« kdy: 05-12-2018, 09:42:37 »
Excellent
Rated 1 time
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/Generics_Collections_TDictionary_(Delphi)

ja viem že je to len example
ale

Kód: Delphi [Vybrat]
  1. City := TCity.Create;

v úvode 3x po sebe, nemá žiadne Free

je to košér?

lebo ak je to príklad, mal by isť príkladom, či?

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 894
  • Karma: 25
    • Verze Delphi: XE8, Seattle
Re:Embarcadero príklad
« Odpověď #1 kdy: 05-12-2018, 09:48:40 »
Vlastní ho Dictionary a to si ho uvolní ve svém Clear/Free, ne?
« Poslední změna: 05-12-2018, 09:52:46 od JaroB »

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1364
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Embarcadero príklad
« Odpověď #2 kdy: 05-12-2018, 10:38:53 »
Excellent
Rated 1 time
je to košér?

Neni, protoze TDictionary se nestara o lifetime klicu ci hodnot. To umi TObjectDictionary.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Embarcadero príklad
« Odpověď #3 kdy: 05-12-2018, 11:26:30 »
Citace
v úvode 3x po sebe, nemá žiadne Free
Na samom konci je jedno uvoľnenie. To asi nepostačuje. Nejako som to neštudoval.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1364
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Embarcadero príklad
« Odpověď #4 kdy: 05-12-2018, 11:45:05 »
Neni, protoze TDictionary se nestara o lifetime klicu ci hodnot. To umi TObjectDictionary.

...a protoze se nikde v kodu neobjevuje extrakce instance (hodnoty slovniku) s jejim naslednym uvolnenim. Celkove je ten priklad pomerne nepekny.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline František

  • Hrdina
  • ****
  • Příspěvků: 443
  • Karma: 5
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Embarcadero príklad
« Odpověď #5 kdy: 06-12-2018, 17:16:50 »
takže kedy budú uvoľnené vytvorené objekty city, ktoré boli pridané do Dictionary?

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Embarcadero príklad
« Odpověď #6 kdy: 06-12-2018, 18:21:18 »
takže kedy budú uvoľnené vytvorené objekty city, ktoré boli pridané do Dictionary?

Při běhu toho programu nebudou uvolněné (memory leak). Po ukončení aplikace je celá ta paměť vrácena operačnímu systému.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 443
  • Karma: 5
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Embarcadero príklad
« Odpověď #7 kdy: 06-12-2018, 19:41:16 »
takže ak to chcem využívať počas celého behu programu, tak to nemusím teda vôbec riešiť?

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Embarcadero príklad
« Odpověď #8 kdy: 06-12-2018, 20:32:50 »
Normální životní cyklus by měl být takový, že vytvořím, držím si odkaz a používám, používám, používám, a když už používat nechci, tak uvolním. Já jsem zvyklý to mít zhruba takto:

Kód: Delphi [Vybrat]
  1. m:=tMemoryStream.Create;
  2. try
  3.  ...
  4.  ...
  5. finally
  6.  FreeAndNil(m);
  7. end;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Embarcadero príklad
« Odpověď #9 kdy: 06-12-2018, 20:37:00 »
Prakticky áno. Ak to chceš mať z programátorskeho hľadiska čisté, tak to pri ikončení aplikácie uvoľníš. Taký FMM4 by ti kričal, že máš memory leak. Len taká podotázočka: používaš ho?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Embarcadero príklad
« Odpověď #10 kdy: 06-12-2018, 20:47:47 »
Prakticky áno. Ak to chceš mať z programátorskeho hľadiska čisté, tak to pri ikončení aplikácie uvoľníš. Taký FMM4 by ti kričal, že máš memory leak. Len taká podotázočka: používaš ho?

Správná připomínka - aby "to křičelo", dá se přidat do .dpr souboru, nejlépe hned za begin:
Kód: Delphi [Vybrat]
  1.  {$IFDEF DEBUG}
  2.   System.ReportMemoryLeaksOnShutdown:=true;
  3.  {$ENDIF}
  4.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Embarcadero príklad
« Odpověď #11 kdy: 06-12-2018, 21:10:03 »
FMM4 je, aspoň podľa návodu čo som čítal o ReportMemoryLeaksOnShutdown, pružnejší. Vypíše memory leak už pri uzavretí formulára. To značne uľahčuje prácu.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2130
  • Karma: 97
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Embarcadero príklad
« Odpověď #12 kdy: 06-12-2018, 22:42:05 »
FMM4 je, aspoň podľa návodu čo som čítal o ReportMemoryLeaksOnShutdown, pružnejší. Vypíše memory leak už pri uzavretí formulára. To značne uľahčuje prácu.

Jelikož ReportMemoryLeaksOnShutdown je testována až ve finalization sekci FastMM4.pas tak to jednoznačně není pravda, navíc nechápu jak by to mělo fungovat, protože i z různých formulářů můžeš alokovat třeba globální proměnné nebo cokoliv jiného a ten memory manager by to v tvém případě reportoval. Prostě je to nesmysl, možná si to pleteš se zavřením posledního formuláře.
Embarcadero MVP - Czech republic

Offline František

  • Hrdina
  • ****
  • Příspěvků: 443
  • Karma: 5
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Embarcadero príklad
« Odpověď #13 kdy: 07-12-2018, 09:09:17 »
takže keď v OnCretae naplním v cykle Dictionary s TCity, musím/mal by som to pri OnClose uvolniť? alebo stačí uvolniť Dictionary (a sním pôjde aj city)?

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Embarcadero príklad
« Odpověď #14 kdy: 07-12-2018, 09:33:42 »
Excellent
Rated 1 time
Když něco vytvoříš v OnCreate, tak to obvykle chceš uvolnit v OnDestroy. V OnClose bych to nedělal, protože zavřený formulář je možné opakovaně zobrazit - někdy se to hodí, protože se zobrazí rychleji, než když se musí nejdřív vytvořit.

tDictionary se o uvolnění nepostará, ale tObjectDictionary to umí - při volání Create mu předáváš jako parametr, zda se má starat o život klíčů a život hodnot.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: