Autor Téma: Diskusia o FreeAndNil - nemal by som ho používať  (Přečteno 1271 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7365
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Diskusia o FreeAndNil - nemal by som ho používať
« kdy: 28-06-2022, 12:58:46 »

Tu je zaujímavá debata na: https://en.delphipraxis.net/topic/7035-freeandnil-the-great-delphi-developer-debate/ Rozumiem len niečomu, ale záver je, žeby som sa mal čo najviac vyhýbať použitiu FreeAndNil.
Škoda, že neviem pochopiť prečo. Niečo tam je vysvetlené, ale ako celok mi to uniká :(  Môj pohľad na to:
  • Ak použijem lokálnu inštanciu, tak mám použiť .Free + nil(?)
  • Ak vytvorím inštanciu v konštruktore a ničím ju v deštruktore, tiež mám použiť .Free + nil
Osobne iné prípady nemám.
Ten nil som dal s otáznikom z jedného dôvodu: Pozrel som sa na Free. Volá Destroy. Funkcia Destroy tam je prázdna. Preto neviem či sa ukazovateľ nastaví na nil !!!
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3412
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #1 kdy: 28-06-2022, 13:53:48 »
Kód: Delphi [Vybrat]
  1. procedure TObject.Free;
  2. begin
  3.   if Self <> nil then
  4.     Destroy;
  5. end;
  6.  

IMHO lokalní proměnné stačí Free, pokud se jedna o globalni nebo proměnné třídy tak vždy FreeAndNil.
Embarcadero MVP - Czech republic

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 552
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #2 kdy: 21-08-2023, 21:15:49 »
No dnes som prvykrat po 20tich rokoch programovania narazil tiez na AV sposobenu vdaka pouzitiu FreeAndNil. Ako nakodil som narychlo len taku utilitku tak som si moc nerobil hlavu s pouzivanim globalnych premennych. Zvycajne ich v projekte mam absolutne minimum. Neviem ake vsetky "side efects" FreeAndNil vie vyvolat, ale jeden z problemov je ze FreeAndNil najprv do globalnej premennej zapise adresu nill a potom vola free. A v mojom pripade ten globalny objekt vo svojom destruktore este likvidoval dalsiu plejadu objektov a niektore z nich potrebovali este nejake doplnkove volania do povodneho globalneho objektu, ale tato premenna uz bola koli funkcii FreeAndNil "znillovana" takze dosla AV 🤷. Dost blbo sa to hlada a stacilo to rozpisat na dva riadky, najprv zavolat free a potom rucne priradit nill. Ale ako hovorim, 20 rokov sa mi to nestalo, pretoze takto hulvatsky vacsinou neprogramujem  ;)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7365
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #3 kdy: 21-08-2023, 21:36:01 »
Ešte je zaujímavá iná skutočnosť.
Na DelphiPraxis sa vyjadrili, že volať pred FreeAndNill test na Assigned() je nezmysel. Lebo samotné FreeAndNil začína týmto testom.
Lenže zásadne ak dám FreeAndNil(MyQuery), pričom MyQuery už prešlo touto procedúrou, tak dostávam AV.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3412
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #4 kdy: 22-08-2023, 08:34:59 »
Excellent
Rated 2 times
Ešte je zaujímavá iná skutočnosť.
Na DelphiPraxis sa vyjadrili, že volať pred FreeAndNill test na Assigned() je nezmysel. Lebo samotné FreeAndNil začína týmto testom.
Lenže zásadne ak dám FreeAndNil(MyQuery), pričom MyQuery už prešlo touto procedúrou, tak dostávam AV.

Tak tam máš nějaký odkaz na tu proměnnou v destructoru => mas to blbe napsane.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3523
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #5 kdy: 22-08-2023, 09:56:14 »
Lenže zásadne ak dám FreeAndNil(MyQuery), pričom MyQuery už prešlo touto procedúrou, tak dostávam AV.
A je nejaky problem vtrasovat do destructoru a zjistit, co tam mas za bordel?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7365
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #6 kdy: 22-08-2023, 10:27:43 »
Nejde o ten bordel. Ten som odstránil. Ide o to, že FreeAndNill nemá čo vyhadzovať AV. Alebo sa mýlim?
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3523
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #7 kdy: 23-08-2023, 07:35:11 »
Nejde o ten bordel. Ten som odstránil. Ide o to, že FreeAndNill nemá čo vyhadzovať AV. Alebo sa mýlim?
Pokud se nejedna o multihreading (neni to atomicka operace) nebo se nejedna o nejakou prasarnu, jak psal Daniel a promenna ma hodnotu nil, tak samozrejme ne, protoze jak ti psali, bezna public metoda TObject.Free() zacina testem na nil.

Jinak samozrejme ano, vcetne nepredvidatelneho chovani pri operaci s dangling pointerem

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7365
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #8 kdy: 23-08-2023, 08:58:20 »
Nič z toho neprichádza do úvahy ;)  Je to obyčajný TQuery.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3412
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #9 kdy: 23-08-2023, 12:32:07 »
Nič z toho neprichádza do úvahy ;)  Je to obyčajný TQuery.

Tak si to preloz s debug dcu a trasuj dovnitr.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3523
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #10 kdy: 24-08-2023, 07:26:54 »
Nič z toho neprichádza do úvahy ;)  Je to obyčajný TQuery.
Nejde o TQuery, ale o promennou, ktera obsahuje odkaz na instanci, pokud to neni automaticka promenna v zasobniku, tak jedna z moznosti je, ze sis nekde pod prd*li uvolnil sam sebe a dobiha ti metoda v objektu, jehoz instance uz byla zrusena -> pak dereference na member variable muze vest k AV, zrovna tak si nekde neco muzes prepisovat v pameti, pokud neco alokujes dynamicky v pameti.

Pokud to neni automaticka promenna, takze zivotni cyklus promenne/instance je omezen na scope subroutiny, tak jak psal Radek, nekde ve sprave zivotniho cyklu mas neco hooodne spatne

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7365
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Diskusia o FreeAndNil - nemal by som ho používať
« Odpověď #11 kdy: 24-08-2023, 08:27:22 »
Je to pole triedy. Dá sa povedať, že som tam porušil, asi nepísané pravidlo, a premennú som uvoľnil po prvom a zároveň poslednom použití. Nech nezaberá miesto  ;D . A to robilo problémy.
Presunul som to Destroy a je pokoj. Ešte mám možnosť to definovať ako lokálnu premennú. To sa mi nechce.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 900
  • Karma: 8
    • Verze Delphi: comunity 10.4.2, D2007, D11