free a g_free

Sekcia: Programovanie 07.09.2007 | 01:57
Avatar Lapajko Arch Linux  Používateľ
Zdravim,

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
    • Re: free a g_free 07.09.2007 | 02:10
      Avatar borg Arch, Debian jessie  Administrátor
      ako vies ze sa neuvolni. po zavolani g_free() sa pointer path stane nevalidny, aj ked moze ukazovat na nejaku adresu (nebude NULL).
      • Re: free a g_free 07.09.2007 | 02:15
        Avatar uid0 Debian  Používateľ
        moze to velmi jednoducho overit este jednym zavolanim prislusneho free() :)
        Debian. apt-get into it…
        • Re: free a g_free 07.09.2007 | 02:37
          Avatar borg Arch, Debian jessie  Administrátor
          a potom tu bude novy topic "po zavolani free() mi pada program"
          • Re: free a g_free 07.09.2007 | 03:24
            Avatar uid0 Debian  Používateľ
            som ale zvedavy ako dospel k nazoru, ze sa pamat "neuvolni" :)
            Debian. apt-get into it…
      • Re: free a g_free 07.09.2007 | 14:25
        Avatar Lapajko Arch Linux  Používateľ
        takže odpoveď pre všetkých:
        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???????????
        • Re: free a g_free 07.09.2007 | 14:41
          Avatar uid0 Debian  Používateľ
          ty si myslis, ze pamat sa pridaluje s granularitou 1 bajt?

          nikdy nepristupuj k uvolnenej pamati, nie je tvoja! (aj ked z toho nemusi byt hned segfault)
          Debian. apt-get into it…
          • Re: free a g_free 07.09.2007 | 14:57
            Avatar Lapajko Arch Linux  Používateľ
            nie som blbec.....

            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
            • Re: free a g_free 07.09.2007 | 15:07
              Avatar uid0 Debian  Používateľ
              nenapisal si co sa sprava rozdielne.

              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
              Debian. apt-get into it…
              • Re: free a g_free 07.09.2007 | 15:13
                Avatar Lapajko Arch Linux  Používateľ
                Čo sa týka rozdielneho správania sa:

                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 či ps.

                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
                • Re: free a g_free 07.09.2007 | 15:22
                  Avatar uid0 Debian  Používateľ
                  a skusal si to iste s konzolovou aplikaciou?

                  nechapem comu sa stale cudujes, uvolnena pamat nie je tvoja starost...
                  Debian. apt-get into it…
                  • Re: free a g_free 07.09.2007 | 15:25
                    Avatar Lapajko Arch Linux  Používateľ
                    ano, presne to isté. Tá konzolová aplikácia fugovala perfektne. Iba som jej kód použil v GTK... a už to nefungovalo.

                    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.
                    • Re: free a g_free 07.09.2007 | 15:26
                      Avatar uid0 Debian  Používateľ
                      a tu funkciu si tiez volal niekolkokrat za sebou na stlacenie klavesy alebo podobne?

                      a zase: uvolnena pamat nie je tvoja starost
                      Debian. apt-get into it…
                      • Re: free a g_free 07.09.2007 | 15:31
                        Avatar Lapajko Arch Linux  Používateľ
                        pri konzolovej aplikácii sa volá pri spustení programu, pri GTK sa volá pri stlačení buttonu
                        • Re: free a g_free 07.09.2007 | 15:37
                          Avatar uid0 Debian  Používateľ
                          aha, takze sa tu bavime o uplnej blbosti (pretoze to nie je nasa starost) a zaroven porovnavame nerovnocenne priklady. good, good...
                          Debian. apt-get into it…