Autor Téma: Zničenie objektu  (Přečteno 5999 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4104
  • Karma: 36
    • Verze Delphi: XE7 professional
Zničenie objektu
« kdy: 16-06-2012, 10:20:55 »
Vytvorím objekty napríklad

Kód: Delphi [Vybrat]
  1.     while not MyQuery.Eof do
  2.     begin
  3.       slstID := TStringList.Create;
  4.       slstID.Add(MyQuery.FieldbyName('IDBlocks').AsString);
  5.       slstID.Add( MyQuery.FieldbyName('IDSVBs').AsString);
  6.       cbbBlock.Items.AddObject(MyQuery.FieldByName('Block').AsString,
  7.         TObject(slstID));
  8.       MyQuery.Next;
  9.     end;
  10.  
  11. Zničím objekty
  12.  
  13. procedure TfrmEntry.FormClose(Sender: TObject; var Action: TCloseAction);
  14. var
  15.   I: Integer;
  16. begin
  17.   for I := cbbBlock.Items.Count -1 to 0 do
  18.     cbbBlock.Items.Objects[I] := nil;
  19. end;
  20.  

Nemám istotu či to je takto správne. Ďakujem
« Poslední změna: 16-06-2012, 10:21:22 od <z> »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1121
  • Karma: 41
    • Verze Delphi: 7, 2010
Re:Zničenie objektu
« Odpověď #1 kdy: 16-06-2012, 10:28:39 »
- ve form close to mozna ani potreba nicit neni, znici se to samo pri zavreni programu
- pokud je to jen zavreni okna, tak to spravne uplne neni, objekt neuvolnis z pameti, jen si smazes ukazatel

Kód: Delphi [Vybrat]
  1. // uvolneni
  2. cbbBlock.Items.Objects[I].Free;
  3. // vycisteni :)
  4. cbbBlock.Items.Objects[I]:=nil;

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Zničenie objektu
« Odpověď #2 kdy: 16-06-2012, 10:51:25 »
- ve form close to mozna ani potreba nicit neni, znici se to samo pri zavreni programu
při ukončování aplikace se uvolní ledacos, ale to neznamená, že je dobrý přístup to nechávat zbytečně v paměti nebo nechávat otevřené soubory. Pokud někoho otravuje uvolňování paměti, může použít nějakou platformu s garbage collectorem (Java, .Net, Smalltalk :-))

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4104
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Zničenie objektu
« Odpověď #3 kdy: 16-06-2012, 10:58:17 »
Je priamo v návode, že takto vytvorené objekty sa samé neuvoľnia. Treba sa o to postarať.

Takže som mal dobré tušenie. FreeAndNil sa použiť nedá.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Zničenie objektu
« Odpověď #4 kdy: 16-06-2012, 11:04:57 »
Takže som mal dobré tušenie. FreeAndNil sa použiť nedá.
FreeAndNil akorát v případě ne nil objektu zavolalo Free (to možná kontroluje Free samo o sobě) a nastavilo jej na nil. Takže pokud ten objekt už nikde jinde nereferencuješ, tak free by mělo stačit

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Zničenie objektu
« Odpověď #5 kdy: 16-06-2012, 13:08:40 »
Já tedy nevidím, že by OP vytvářel nějaké objekty, takže je IMHO naprosto správně, že je následně neničí...

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Zničenie objektu
« Odpověď #6 kdy: 20-06-2012, 20:36:12 »
Objekty vložené do Listu se sami nemůžou uvolňovat. Pokud bys měl dva Listy se společnými objekty, tak by to padalo jako hrušky  :)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2252
  • Karma: 100
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Zničenie objektu
« Odpověď #7 kdy: 20-06-2012, 20:40:00 »
Objekty vložené do Listu se sami nemůžou uvolňovat. Pokud bys měl dva Listy se společnými objekty, tak by to padalo jako hrušky  :)

Ehm. To bude platit do doby než bude mít Delphi automatické počítání referencí... Podobně jako jsou dnes automaticky počítány reference řetězců.
Embarcadero MVP - Czech republic

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Zničenie objektu
« Odpověď #8 kdy: 20-06-2012, 20:49:32 »
Ehm. To bude platit do doby než bude mít Delphi automatické počítání referencí... Podobně jako jsou dnes automaticky počítány reference řetězců.
Boha jeho, to něco takového chtějí dělat? to asi moc nepřispěje k rychlosti, co?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2252
  • Karma: 100
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Zničenie objektu
« Odpověď #9 kdy: 20-06-2012, 21:07:11 »
Uvidí se. Uvažuje se o tom vyhledove - viz i ta anketa. Ale neplet si to s garbage collectorem.

Jinak počítání referencí na rychlost nemá moc vliv. Prostě když se přiřadí nil, nebo zmizí z viditelnosti nebo zavolas free, tak se zmensi pocitadlo referenci a pri nule se objekt uvolní. V postate to samé se děje už dnes u stringu. Mne se to celkem libi.

Ale jak říkam. Uvidí se.
Embarcadero MVP - Czech republic

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Zničenie objektu
« Odpověď #10 kdy: 20-06-2012, 23:05:28 »
Objekty vložené do Listu se sami nemůžou uvolňovat. Pokud bys měl dva Listy se společnými objekty, tak by to padalo jako hrušky  :)
AFAIK se u listu dala nastavit nějaká property určující, jestli ty objekty vlastní a pak je mohl i uvolňovat. Nebo to bylo někde jinde?

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Zničenie objektu
« Odpověď #11 kdy: 20-06-2012, 23:08:55 »
Uvidí se. Uvažuje se o tom vyhledove - viz i ta anketa. Ale neplet si to s garbage collectorem.

Jinak počítání referencí na rychlost nemá moc vliv. Prostě když se přiřadí nil, nebo zmizí z viditelnosti nebo zavolas free, tak se zmensi pocitadlo referenci a pri nule se objekt uvolní. V postate to samé se děje už dnes u stringu. Mne se to celkem libi.

Reference counting byl jeden z těch naivnějších implementací garbage collectoru. Má to ale svoje problémy, takže pro obecné potřeby se používají jiné metody. Pokud třeba někde vznikne cyklus (objekty odkazující se na sebe navzájem), tak je samotný RC neuvolní a zůstanou v paměti, i když už je nic dalšího nepoužívá.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1121
  • Karma: 41
    • Verze Delphi: 7, 2010
Re:Zničenie objektu
« Odpověď #12 kdy: 20-06-2012, 23:09:23 »
u normalniho ne, ale treba Indy komponenty to tak maj v jednom kodu, ze se priradi vlastnik ;)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2252
  • Karma: 100
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Zničenie objektu
« Odpověď #13 kdy: 20-06-2012, 23:21:39 »
Reference counting byl jeden z těch naivnějších implementací garbage collectoru. Má to ale svoje problémy, takže pro obecné potřeby se používají jiné metody. Pokud třeba někde vznikne cyklus (objekty odkazující se na sebe navzájem), tak je samotný RC neuvolní a zůstanou v paměti, i když už je nic dalšího nepoužívá.

Jo, ale vždy máš možnost nastavit jeden na nil, což provede snížení počtu. Ale jak říkám, neví se zda a kdy se do dostane do kompilátoru a jazyka.
Embarcadero MVP - Czech republic

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Zničenie objektu
« Odpověď #14 kdy: 21-06-2012, 05:33:41 »
Jinak počítání referencí na rychlost nemá moc vliv. Prostě když se přiřadí nil, nebo zmizí z viditelnosti nebo zavolas free, tak se zmensi pocitadlo referenci a pri nule se objekt uvolní. V postate to samé se děje už dnes u stringu. Mne se to celkem libi.
Zase tak prosté to není. Konkrétně Delphi konkrétně u interfaců (kde se s tím dost pracuje) jde poměrně snadno dostat do situace, kdy nějaký objekt zůstane navždy alokován, protože si Delphi myslí, že ještě existují nějaké reference.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Zničenie objektu
« Odpověď #15 kdy: 21-06-2012, 09:12:16 »
Jo, ale vždy máš možnost nastavit jeden na nil, což provede snížení počtu. Ale jak říkám, neví se zda a kdy se do dostane do kompilátoru a jazyka.

Pokud A ukazuje na B a B zpátky, tak nastavením B na nil se myslím moc nevyřeší, protože ten objekt je pořád referencovaný z A. A pokud něco spoléhá na to, že někdo bude objekty nastavovat na nil, tak to má jenom malou výhodu oproti klasickému uvolňování přes free.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2252
  • Karma: 100
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Zničenie objektu
« Odpověď #16 kdy: 21-06-2012, 09:35:26 »

Pokud A ukazuje na B a B zpátky, tak nastavením B na nil se myslím moc nevyřeší, protože ten objekt je pořád referencovaný z A. A pokud něco spoléhá na to, že někdo bude objekty nastavovat na nil, tak to má jenom malou výhodu oproti klasickému uvolňování přes free.

Čistě hypoteticky by tam mohla být jazyková konstrukce určující takovou volnou vazbu. Já vám v tomto okamžiku říct více nemohu, nic není jisté.
Embarcadero MVP - Czech republic

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Zničenie objektu
« Odpověď #17 kdy: 21-06-2012, 10:07:40 »
Abych řekl pravdu, doufám, že tohle do Delphi nakonec nepřijde. U stringů reference-counting funguje docela dobře (i když FasMM_FullDebugMode si myslí něco jiného), ale u interfaců na to dost nadávám, kdykoliv s nimi musím pracovat.