Hromada proměnných (Heap), alokace a dealokace paměti v IDL, ukazatele

Práce v IDL bez ukazatelů

Pokud v IDL vytváříme struktury (záznamy), jejichž položky jsou pole, často stojíme před problémem, že velikost těchto polí musí být fixní (tj. určená v okamžiku vzniku struktury).

;příklad - struktura se skalarem a poli 1x10 a 2x3
X={a: 1L, b:Fltarr(10), c:Dblarr(2,3)}

Pokud chceme do položky c nyní uložit např. pole celých čísel o pěti prvcích, musíme znovu do X uložit celou strukturu:

;příklad - struktura se skalarem a poli 1x10 a 1x5
X={a: X.a, b:X.b, c:Intarr(5)}

Tento způsob je při větším počtu položek nebo jejich vnoření nepraktický a navíc funguje jen pro anonymní struktury. Správnou metodou je využití ukazatelů jako zvláštního typu proměnných vytvářených na hromadě (dalším podobným typem jsou ještě objekty). Obsahem proměnné typu ukazatel přitom není adresa paměti, ale index do vnitřních tabulek IDL. Proto je práce s ukazateli v IDL celkem bezpečná - při nesprávném programování dochází nejvýše k pozvolnému úniku volné paměti, která však může být reaktivována. Uvedený příklad řešený pomocí ukazatelů naleznete na konci této kapitoly.

IDL ve skutečnosti vytváří všechny proměnné na hromadě, jejich identifikátory však představují přímé odkazy. O alokaci a dealokaci paměti se v pozadí stará manažer hromady. Přiřazením nového obsahu do proměnné se zároveň vyhradí potřebné místo v paměti a případně se uvolní původní, nyní již nepotřebné. To se samozřejmě neděje, pokud přiřazujeme jen do části proměnné (do určité položky struktury, do podmnožiny buněk pole).

Funkce Temporary(P) poskytne obsah proměnné P v parametru, po té paměť alokovanou proměnné P uvolní a její identifikátor se stane nedefinovaným. Takto obvykle uvolňujeme již nepotřebná data, která zabírají hodně místa v paměti.

;příklad - G a H jsou velká pole
G=0 ;radikální zmenšení alokované paměti pro G, proměnná G je stále definována> x=Total(Temporary(H)) ;při posledním použití dealokace paměti H

Práce s ukazateli

Používáme-li ukazatele, závisí alokace a dealokace částečně na nás. Proměnné na hromadě musíme umět vytvořit a uschovat odkazy na ně, musíme umět testovat platnost těchto odkazů a s jejich pomocí pracovat s obsahem proměnných. Nakonec musíme umět proměnné na hromadě zrušit, včetně těch, na které se odkazy nedopatřením ztratily. Následující body shrnují používané funkce a procedury a uvádějí příklady:


Na závěr uvádím zápis úvodního motivačního příkladu pomocí ukazatelů:

;příklad - struktura se skalárem, polem 1x10 a obecným typem dat
X={a: 1L, b:Fltarr(10), c:Ptr_new(/allocate_heap)}    
;do položky c uložíme pole 2x3
*X.c=Dblarr(2,3)}
...
;do položky c uložíme pole 1x5
*X.c=Intarr(5)}


L.Přech, poslední úpravy 6.2.2004