Forum Delphi.cz

Delphi => Obecné => Téma založeno: Stanislav Hruška 16-06-2012, 10:20:55

Název: Zničenie objektu
Přispěvatel: Stanislav Hruška 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
Název: Re:Zničenie objektu
Přispěvatel: < z > 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;
Název: Re:Zničenie objektu
Přispěvatel: Mi.Chal. 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 :-))
Název: Re:Zničenie objektu
Přispěvatel: Stanislav Hruška 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á.
Název: Re:Zničenie objektu
Přispěvatel: Mi.Chal. 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
Název: Re:Zničenie objektu
Přispěvatel: pepak 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čí...
Název: Re:Zničenie objektu
Přispěvatel: Fala 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  :)
Název: Re:Zničenie objektu
Přispěvatel: Radek Červinka 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ů.
Název: Re:Zničenie objektu
Přispěvatel: Fala 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?
Název: Re:Zničenie objektu
Přispěvatel: Radek Červinka 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.
Název: Re:Zničenie objektu
Přispěvatel: Mi.Chal. 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?
Název: Re:Zničenie objektu
Přispěvatel: Mi.Chal. 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á.
Název: Re:Zničenie objektu
Přispěvatel: < z > 20-06-2012, 23:09:23
u normalniho ne, ale treba Indy komponenty to tak maj v jednom kodu, ze se priradi vlastnik ;)
Název: Re:Zničenie objektu
Přispěvatel: Radek Červinka 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.
Název: Re:Zničenie objektu
Přispěvatel: pepak 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.
Název: Re:Zničenie objektu
Přispěvatel: Mi.Chal. 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.
Název: Re:Zničenie objektu
Přispěvatel: Radek Červinka 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é.
Název: Re:Zničenie objektu
Přispěvatel: pepak 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.