Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TButton Free memory leak

[es] :: Pascal / Delphi / Kylix :: TButton Free memory leak

[ Pregleda: 2301 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon TButton Free memory leak08.04.2010. u 14:27 - pre 170 meseci
Pozdrav,

problem je slijedeći: dinamički se kreiraju TButton kontrole i dodjeljuju im se OnClick eventi. Problem nastaje kada treba TButton osloboditi.

Ne uspijeva sa niti jednim
TButton.Free;
FreeAndNil(TButton);

tj. malo radi, malo ne, nakon par kreiranja/uništavanja javlja se memory leak.

Zanimljivo je da se taj problem ne događa sa buttonima koji nemaju opciju fokusiranja.

Ideje, iskustva?

Hvala.
F
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: TButton Free memory leak08.04.2010. u 18:06 - pre 170 meseci
> problem je slijedeći: dinamički se kreiraju TButton kontrole i dodjeljuju im se OnClick eventi. Problem nastaje kada treba TButton osloboditi.
> Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Da li ti je ovo greška u kucanju, ovo ne radi ništa. Treba ti nešto poput btnOK.Free.

> tj. malo radi, malo ne, nakon par kreiranja/uništavanja javlja se memory leak.

Kako to testiraš i da li ti prijavljuje baš za buttone ili neke druge stvari?

> Zanimljivo je da se taj problem ne događa sa buttonima koji nemaju opciju fokusiranja.

Šta znači opcija fokusiranja, kako se ta dugmad razlikuju od ostalih?

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: TButton Free memory leak08.04.2010. u 18:31 - pre 170 meseci
Citat:
savkic: > problem je slijedeći: dinamički se kreiraju TButton kontrole i dodjeljuju im se OnClick eventi. Problem nastaje kada treba TButton osloboditi.
> Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Da li ti je ovo greška u kucanju, ovo ne radi ništa. Treba ti nešto poput btnOK.Free.

> tj. malo radi, malo ne, nakon par kreiranja/uništavanja javlja se memory leak.

Kako to testiraš i da li ti prijavljuje baš za buttone ili neke druge stvari?

> Zanimljivo je da se taj problem ne događa sa buttonima koji nemaju opciju fokusiranja.

Šta znači opcija fokusiranja, kako se ta dugmad razlikuju od ostalih?


Naravno, greška u kucanju. Button1.Free i FreeAndNil(Button1) npr.

Ne znam za šta prijavljuje, u to problem, dobijem AccessViolation err ili Abstract err. Buttoni se kreiraju na MainForm.OnShow, za svaki element u mainMenu se kreira button i procedura OnClick.
Npr. SpeedButton nema opciju da može primiti fokus (npr da možemo sa tabom doći do njega), i sa tim buttonima radi sve ok. Ako se SpeedButtoni zamijene sa TButton-ima, javlja se taj leak u petlji gdje se radi Button.Free

Dakle, u kodu se ništa ne mijenja, samo se zamijeni TSpeedButton sa TButton.

Hvala savkic na odgovoru, sutra ču ti pokušati poslati primjer koda.
F
 
Odgovor na temu

sasaz2008

Član broj: 200415
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: TButton Free memory leak08.04.2010. u 18:54 - pre 170 meseci
>Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Kako je već rečeno, ne možeš se oslobadjati klasa, već samo njihova instanca. Ali to je verovatno greška u copy&paste....

Problem je verovatno u tome što nije baš preporučljivo raditi Free i FreeAndNil zajedno, pošto FreeAndNil upravo radi sledeće:

Btn:=TButton.Create(...):
...
//FreeAndNil(Btn);
Btn.Free;
Btn:=nil;

I naravno, pre oslobadjanja promeni fokus na formu ili neku komponentu koja nije dinamički generisana.
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: TButton Free memory leak08.04.2010. u 18:56 - pre 170 meseci
Citat:
sasaz2008: >Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Kako je već rečeno, ne možeš se oslobadjati klasa, već samo njihova instanca. Ali to je verovatno greška u copy&paste....

Problem je verovatno u tome što nije baš preporučljivo raditi Free i FreeAndNil zajedno, pošto FreeAndNil upravo radi sledeće:

Btn:=TButton.Create(...):
...
//FreeAndNil(Btn);
Btn.Free;
Btn:=nil;


Ma greškom sam upisao, znam da ne mogu oslobađati klase :)

Krivo si shvatio, ne radim zajedno Free i FreeAndNil, nego ne radi niti sa .Free niti sa FreeAndNil().
F
 
Odgovor na temu

sasaz2008

Član broj: 200415
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: TButton Free memory leak08.04.2010. u 19:05 - pre 170 meseci
U svojstvo OnClick event buttona koji se briše takodje se pre toga stavlja nil?

Promeni pre toga fokus na formu ili neku komponentu koja nije dinamički generisana i trebalo bi da radi bez problema.

[Ovu poruku je menjao sasaz2008 dana 08.04.2010. u 20:15 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: TButton Free memory leak08.04.2010. u 22:54 - pre 170 meseci
> Ne znam za šta prijavljuje, u to problem, dobijem AccessViolation err ili Abstract err.

Ček to su različite stvari, memory leak znači da neki objekat ne oslobađaš a AV znači pristup nealociranoj memoriji (najčešće uništavanje ili pristup već uništenom objektu), abstract error znači upotrebu neke apstraktne metode. Pošalji kod i napiši šta se tačno dešava. Za kontrolisanje memorije preporučujem FastMM (stavi ga za memory manager), na kraju rada programa on će ti detaljno ispisati šta je ostalo neoslobođeno.

> Buttoni se kreiraju na MainForm.OnShow, za svaki element u mainMenu se kreira button i procedura OnClick.

A kada se uništavaju? Ako se to radi na kraju života forme, onda i ne moraš raditi eksplicitno uništavanje, dovoljno je da staviš za owner buttona formu.

> Npr. SpeedButton nema opciju da može primiti fokus (npr da možemo sa tabom doći do njega), i sa tim buttonima radi sve ok.

Prisustvo ili odsustvo fokusa sigurno nije uzrok. Da li ti koristiš baš TButton i TSpeedButton kontrole ili neke njihove naslednice?

 
Odgovor na temu

sasaz2008

Član broj: 200415
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: TButton Free memory leak09.04.2010. u 00:31 - pre 170 meseci
Denise,

Bilo bi od velike pomoći kada bi poslao jednostavan project sors koji demonstrira grešku i napisao koju verziju Delphi-ja koristiš.
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: TButton Free memory leak09.04.2010. u 01:02 - pre 170 meseci
Hvala svima na trudu, stavit ću sutra source sa primjerom, pa će biti mnogo jasnije.
Našao je kolega drugo rješenje, ali jako me zanima zašto to ne radi kako bi trebalo raditi.
F
 
Odgovor na temu

rambo
Dejan Petković
Beograd

Član broj: 6095
Poruke: 190
*.dynamic.sbb.rs.



+6 Profil

icon Re: TButton Free memory leak10.04.2010. u 01:27 - pre 170 meseci
Zašto koristiš OnShow forme za kreiranje komponenti? Za to se obično koristi OnCreate. Nešto mi sumnjivo baš to. Moguće je da se problem javlja baš zbog OnShow jer se (iste) komponente kreiraju svaki put kada ta forma dobije fokus, što predpostavljam da nije namera. Prebaci kreiranje tih buttona u OnCreate pa proveri dali ti se javljaju isti problemi.
"There is a theory which states that if ever anybody discovers exactly what the
Universe is for and why it is here, it will instantly disappear and be replaced by
something even more bizarre and inexplicable. There is another theory which states
that this has already happened."
-- Douglas Adams
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: TButton Free memory leak

[ Pregleda: 2301 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.