free() c

Sekcia: Programovanie 05.12.2007 | 16:30
ušiak   Návštevník
čaute, potrebujem radu. Mám dynamické pole ukazovateľov na štruktúry - TYP_STRUKTURY ** pole. Počas priebehu programu sa samozrejme mení počet týchto ukazovateľov v poli. Pri uvoľňovaní chcem uvoľniť miesto v pamäti, kde je uložený daný smerník, čiže jeho prislúchajúca štruktúra musí zostať nedoktnutá (s ňou budem pracovať pomocou iného smerníka). Príkaz free((void *) *(pole + i); uvoľní miesto v pamäti, kde je uložená i-tá štruktúra, čiže to nie je ten správny príkaz. Príkaz free((void *) pole) uvoľní celé alokované pole smerníkov a štruktúry zostanú nedotknuté, to je tiež na nič...Preto sa sa pýtam, akým spôsobom sa dá dosiahnuť, aby sa uvoľnilo iba miesto, kde je uložený daný smerník. ďakujem....
    • Re: free() c 05.12.2007 | 16:47
      Avatar Ladislav Michnovic SuSE  Používateľ
      No ja by som si ulozil ten smernik, ktory uz nepotrebujes niekam a prepojil smerniky pred nim a za nim. A potom ho uvolnil. Ale ako to spravit presne v C, na to si netrufam.
      Ladislav.
      Only man who sells empty boxes is the undertaker.
    • Re: free() c 05.12.2007 | 16:49
      Avatar uid0 Debian  Používateľ
      ty chces takto fragmentovat pamat kvoli 4B?

      a nie, nemozes uvolnit 4B v alokovanom bloku pamate (ak som to dobre pochopil)

      ale pre tvoje pouzitie by si mal vyhladat nieco o linked list
      Debian. apt-get into it…
      • Re: free() c 05.12.2007 | 17:48
        Avatar Ladislav Michnovic SuSE  Používateľ
        V tej svojej konstrukcii som ticho predpokladal, ze pouziva linked list.
        Only man who sells empty boxes is the undertaker.
        • Re: free() c 05.12.2007 | 17:52
          Avatar uid0 Debian  Používateľ
          tazko, tazko, on ma pole pointerov na nejaku strukturu
          Debian. apt-get into it…
          • Re: free() c 05.12.2007 | 17:55
            Avatar Ladislav Michnovic SuSE  Používateľ
            Nepozorne som si precital zadanie.
            Only man who sells empty boxes is the undertaker.
    • Re: free() c 06.12.2007 | 00:22
      Avatar lipo Arch Linux  Používateľ
      Alebo by si to mohol urobit aj tak, ze strukturu, ktorej miesto v pamati chces uvolnit si uloz do pomocnej premennej a potom vsetky struktury v poli co boli za nou iba posun o jedno miesto dozadu. Potom ak chces aj zmensit velkost pola (pamat ktoru zabera), tak tam je na to funkcia realloc. Zapisuje sa x = realloc (x, n * sizeof (NAZOV_STRUKTURY)), kde x je pole struktur a n je velkost pamate ktora bude vyhradena pre nove pole.
      • Re: free() c 06.12.2007 | 00:40
        Avatar uid0 Debian  Používateľ
        lol, a teraz si predstav, ze ti nahodou realloc vrati NULL :D
        Debian. apt-get into it…
        • Re: free() c 07.12.2007 | 13:49
          Avatar lipo Arch Linux  Používateľ
          Myslis, ze by sa to v tomto pripade mohlo stat? Podla mna, ak by sa vsetko spravne zadavalo, tak by to nemalo vratit NULL. Este som s C-ckom vela nerobil, ale NULL mi to zatial vratilo iba ked som nieco zle zadal.. Potom som si opravil chybu a uz mi NULL nevracalo.. Kedy presne vrati malloc, alebo realloc NULL?
          • Re: free() c 07.12.2007 | 13:50
            Avatar borg Fedora  Administrátor
            nikdy nepredpokladaj ze kazdy vstup bude validny. nikomu nikdy never co zadal ako vstup
          • Re: free() c 07.12.2007 | 14:14
            Avatar Miroslav Bendík Gentoo  Administrátor
            Je fakt, že null ti vráti ťažko, skôr než ti to spapá RAM ti to zabije kernel, ale predsalen radšej kontroluj.
            • Re: free() c 07.12.2007 | 14:18
              Avatar borg Fedora  Administrátor
              zabije kernel? ale my sme v userspace a nie v kernel space. jedine ze sa spusti OOM killer.
              • Re: free() c 07.12.2007 | 14:50
                Avatar Miroslav Bendík Gentoo  Administrátor
                No OOM je v kerneli (ak sa nemylim) takze mi tu aplikaciu v podstate zabije kernel, nie? (teda aspon jeho sucast)
                • Re: free() c 07.12.2007 | 14:52
                  Avatar uid0 Debian  Používateľ
                  a ty vies koho zabije OOM killer? ;)
                  Debian. apt-get into it…
            • Re: free() c 07.12.2007 | 14:18
              Avatar borg Fedora  Administrátor
              vrati samozjreme null iba ak je nedostatok pamate (memory out)
              • Re: free() c 07.12.2007 | 14:45
                Avatar uid0 Debian  Používateľ
                vzhladom na to, ze ide o realokaciu na mensiu velkost tazko, ale slepo si prepisovat pointre je strasna blbost
                Debian. apt-get into it…
                • Re: free() c 07.12.2007 | 15:41
                  Avatar borg Fedora  Administrátor
                  ano, ja som reagoval iba na pripad iba kedy moze zlyhat realloc(). z toho logicky vyplyva ze pri zvacsoavni miesta.
                  • Re: free() c 07.12.2007 | 15:47
                    Avatar uid0 Debian  Používateľ
                    lenze on moze zlyhat kedykolvek, nemas nikdy zaruku

                    a ked mam uviest nejaky priklad, kde to nie je len "prilisna" opatrnost -- mas par mega alokovanych a zmensich ich na par bajtov, tak ti to realloc moze skusit presunut inam a vtedy to kludne moze rachnut...
                    Debian. apt-get into it…
            • Re: free() c 08.12.2007 | 17:58
              Avatar lipo Arch Linux  Používateľ
              Ale chalani, ved on chcel vediet iba zaciatocnicku vec a vy uz rozoberate take pokrocile veci.. Podla mna to co som napisal mu pomoze (v tom v com on potrebuje).
              Vy inac ako riesenie navrhujete ten linked list?
              • Re: free() c 08.12.2007 | 18:01
                Avatar uid0 Debian  Používateľ
                samozrejme, tvoje riesenie mu preindexuje cely zbytok pola (co moze byt neziaduce) a zbytocne naraba s pamatou
                Debian. apt-get into it…