17.5. ICUFREE Funkce: Podprogram ICUFREE uvolní úsek paměti přidělený položce z LINKAGE SECTION předchozím vyvoláním podprogramu ICUGETV nebo provedením příkazu LOAD. Způsob volání: CALL 'ICUFREE' USING položka Pravidla: Za USING je třeba uvést položku popsanou v LINKAGE SECTION nebo ve FILE SECTION s číslem úrovně 01 nebo 77, jíž byl během předešlého výpočtu přidělen úsek paměti pomocí podprogramu ICUGETV nebo příkazu LOAD, přičemž toto přidělení nebylo doposud změněno (např. novým přidělením jiného úseku paměti) ani zrušeno (např. dřívějším vyvoláním podprogramu ICUFREE). Podprogram ICUFREE vyvolá systémovou funkci free, jíž předá adresu odpovídající uvedené položce. Tato funkce nyní uvolní celý vyhrazený úsek paměti v téže délce, v jaké byl vyhrazen. (Tuto délku si operační systém zapamatoval při vyhrazování úseku. Nelze vyžádat uvolnění kratšího ani dalšího úseku, než jaký byl vyhrazen. Proto je též okamžitá délka položky uvedené za USING bezvýznamná a může se tedy jakkoliv lišit od délky zadávané pro ICUGETV; z důvodu kompatibility však doporučujeme, aby položka měla stejnou délku jako uvolňovaný úsek.) Uvolněný úsek paměti může být (třeba i v jiné délce) znovu vyhrazen při novém vyvolání podprogramu ICUGETV nebo ICVIRG, při provádění příkazu LOAD, při otevírání některého souboru, při třídění příkazem SORT apod. Dále podprogram ICUFREE vynuluje ukazatel přidělený zadané položce, takže tato položka nebude mít od této chvíle přidělenu paměť a jakýkoliv pokus změnit její hodnotu nebo hodnotu některé položky jí podřízené nebo ji redefinující může způsobit havárii výpočtu. Poznámky: 1) Je-li v příkazu CALL 'ICUFREE' uvedena položka, která doposud vůbec nedostala přidělenu paměť, nebo položka, jejíž úsek paměti byl již dříve uvolněn pomocí podprogramu ICUFREE (tzn. je-li ukazatel nulový), bude příkaz CALL 'ICUFREE' neúčinný. Je-li zde však uvedena položka, jejíž ukazatel byl naposledy naplněn jiným způsobem než podprogramem ICUGETV nebo příkazem LOAD, může dojít ke zrušení paměti přidělené jiným položkám nebo souborům anebo dokonce ke zrušení paměti vyhrazené operačním systémem, což může mít za následek velmi vážnou havárii (nejen výpočtu, ale třeba i přemazání disku!!!). 2) Úsek paměti přidělený položce z LINKAGE SECTION pomocí podprogramu ICUGETV nebo příkazu LOAD se při vyvolání podprogramu ICUFREE (a rovněž tak i při ukončení výpočtu příkazem STOP RUN nebo chybou, nebyl-li podprogram ICUFREE předtím vyvolán) zcela zruší včetně svého obsahu, jenž se tedy (na rozdíl od zpracování pomocí podprogramů ICVIRG a ICVIRF) nikam neukládá. Paměť přidělovaná podprogramem ICUGETV je tedy vhodná pro pracovní údaje, které nejpozději při konci výpočtu zanikají, a nikoliv pro soubory dat a tabulky trvalého charakteru, pro jejichž zpracování jsou určeny podprogramy ICVIRG a ICVIRF. Použití: Přidělíme-li položce z LINKAGE SECTION paměť pomocí ICUGETV nebo LOAD, je vhodné tuto paměť uvolnit pomocí podprogramu ICUFREE co nejdříve po tom, co zpracování položky skončilo a položku již nebudeme dále potřebovat. Toto uvolnění ovšem nikterak není povinné; obzvláště by bylo zbytečné, kdyby zmíněný okamžik nastal až bezprostředně před ukončením výpočtu, neboť při ukončení výpočtu příkazem STOP RUN nebo chybou se stejně veškerá přidělená paměť uvolní. Pokud by se však mezi ukončením veškeré práce s položkou a ukončením výpočtu ještě měly provádět nějaké složitější akce, je vhodné vyhrazenou paměť uvolnit pomocí podprogramu ICUFREE. Obzvláště je to potřebné v případě, budeme-li v dalším výpočtu znovu přidělovat paměť jiné (nebo i téže) položce pomocí podprogramu ICUGETV resp. ICVIRG nebo pomocí příkazu LOAD, třídit příkazem SORT, otevírat některý soubor nebo provádět (třeba i ve vyvolaném podprogramu nebo skrze příkaz UFO) jakoukoliv akci vyžadující přidělování paměti. Pokud bychom totiž vyhrazenou paměť neuvolnili, může dojít (zvláště při opakovaném opomenutí) k vyčerpání veškeré volné paměti a v důsledku toho k havárii výpočtu. Příklad: LINKAGE SECTION. 01 TABULKA. 02 PRVEK PIC S9999V99 COMP OCCURS 10000. : CALL 'ICUGETV' USING TABULKA : : (výpočet používající položku TABULKA) : CALL 'ICUFREE' USING TABULKA : : (další výpočet nepoužívající TABULKA) : STOP RUN.