mam problem pri pisani GTK aplikacie.
Prehladavam disk a zapisujem mena adresarov a suborov.
Pamat alokujem pomocou g_malloc, malloc, alebo g_new.
Vsetko ide dobre, ale pri volani free, alebo g_free sa pamat neuvolni. Skusal som vsetky mozne sposoby a funkcie, ale nic nepomohlo.
Zistil som vsak, ze ak alokujem vela pamate, napr:
path = (gchar *) g_malloc(999999 * sizeof(gchar));tak funguje aj g_free a uvolnenie pamate.
Ked ale alokujem male mnozstvo, napr.
path = (gchar *) g_malloc(40 * sizeof(gchar));tak sa pamat neuvolni.
Tusite v com moze byt chyba, alebo to mozete niekto vyskusat, ci sa to stava aj vam?
Ja som uz v koncoch :(
dakujem
1. prípad (alokovanie veľkého počtu *gchar)
2. prípad (alokovanie malého počtu *gchar)
--------------------
Prvý test:
Spustil som program, pozrel som si VM-size.
Alokokoval som pamäť, VM-size sa zväčšila.
Po uvolnení:
1. prípad: VM-size sa zmenšila na pôvodnú veľkosť
2. prípad: VM-size sa vôbec nezmenila
-------------------
Druhý test:
Robil som to isté ako pri prvom ,ale 2-krát som zavolal g_free
Výsledok: program samozrejme padol, ale dôvody boli rozdielne
-------------------
Tretí test:
Spustil som program, pozrel som si VM-size.
Alokokoval som pamäť, naplnil som gchar
Po uvolnení som zavolal g_print("%s", path);
1. prípad: segmentation fault
2. prípad: printovalo to neznáme znaky, ale niečo vyprintovalo dobre. Z 40 znakového stringu printovalo asi polovicu v poriadku.
Prečo sú také rozdiely medzi 1. a 2. prípadom???????????
nikdy nepristupuj k uvolnenej pamati, nie je tvoja! (aj ked z toho nemusi byt hned segfault)
viem, že pamäť sa prideľuje po blokoch, nie po bytoch. Nekúpil som si počítač predvčerom
Takisto viem, že keď pamäť uvoľním a potom ju použijem (teda print), môže tam byť niečo zapísané, ale pamäť už nie je pridelená mne. Iba som skúšal ako sa to správa.
Tak mi niekto vysvetlite ako to mám spraviť, keď musím prehľadať celý diskový priestor a potrebujem si zapamätať názvy súborov. Musím to alokovať postupne. Keď prehľadám 300 GB, už nejde o 30 KB pamäte....
Takýto programík som už napísal, a fugovalo aj uvoľnovanie pamäte. Bolo to ale v C. Keď som to ale prehodil do GTK, tak sa už pamäť neuvoľnovala. Tak som teda prepísal všetky dátové typy a funcie do glib (namiesto free som použil g_free atď).
proste nerozumiem tomu, prečo sa to tak rozdielne správa
1) subory si zapamatavaj ako uznas za vhodne.
2) nechapem preco nepouzijes na vyhladanie suborov find.
3) ked volas free, pamat sa uvolni tak ako sa ma
Napísal program v C (terminal application), ktorý fungoval presne tak ako mal. Alokoval malé množstvá pamäte a aj ich uvoľnoval. Pozoroval som to cez
top
čips
.Keď som presne ten istý kód použil v GTK aplikácii, už sa pamäť neuvoľnovala. Proste som na onclick zavolal presne tú istú funkciu ako v tej kozolovej aplikácii. Neviem či je to preto, že je to GTK aplikácia, či ide o knižnice, spôsob kompilovania, alebo čokoľvek iné.
Ale radšej túto tému ukončime, nikam to nevedie
nechapem comu sa stale cudujes, uvolnena pamat nie je tvoja starost...
No mňa tá pamäť trápi preto, že keď to zaberie 200 MB pamäte a neuvoľní ju, tak je to prúser.
a zase: uvolnena pamat nie je tvoja starost
ked si otvorim okno, tak sa zmeni sposob alokovania a uvolnovania pamate?
z prikladu vidis, ze tak ci tak sa naraba s tym istym memory poolom, ktory ti spravuje libc
http://library.gnome.org/devel/gtk-faq/stable/x703.html
http://ethereal.com/lists/ethereal-users/200407/msg00023.html
http://www.ethereal.com/lists/ethereal-dev/200510/msg00199.html
http://developer.gimp.org/api/2.0/glib/glib-running.html
Píšem to sem preto, keby mal niekto podobný problém, aby sa nemusel trápiť ako ja