REDGUY: implementace bude trochu na dýl... v C to bude asi makro, ve kterém bude skrytý jednoprůchodový for() cyklus, který něco udělá před vstupem do scope, něco na jeho konci, že ano. to je k té implementaci asi všechno, kdyby to "něco" bylo úplně triviální, tak už to mám hotové :-)
popis pro uživatele: dejme tomu, že chceš napsat funkci, která až skončí, tak zahodí veškerou paměť alokovanou na heapu - dejme tomu - kromě datové struktury, na kterou má vrátit odkaz (a tedy i všech dílčích bufferů, na které tato struktura odkazuje - např. dílčí alokované stringy, apod.). pak bych to napsal třeba takhle (NějakýTyp je typu pointer - kdybys tam hledal hvězdičku a get(..) je základní podoba mého alokátoru paměti, který k tomu forget a remember patří):
NějakýTyp nějakáfunkce(parametry)
{
NějakýTyp returnValue;
forget
{
NěcoDočasného tmp=get(...něco...);
if(neošetřenNějakýZvláštníPřípad(NěcoDočasného))
{
return NULL;
}
remember
{
returnValue=get(...něco...);
returnValue->NějakáPodstruktura=get(...něco...);
atd.
}
NěcoJinéhoDočasného tmp2=get(...něco...);
atd.
}
return returnValue;
}
Popravdě - tenhle případ je hodně obecný a bude popisovat hodně častý případ: v "dřevním C" bys tu paměť vyhradil na úrovni toho scope, který danou funkci volá a předal by si pointer: ovšem pokud by ta funkce ani nedokázala splnit to, co má za úkol, tak by ta funkce třeba byla alokovaná zbytečně - tedy určitě má smysl alokovat paměť pro výsledek toho, co má funkce dělat, až když víme, že to opravdu lze provést. Celkově jsou podobné funkce dnes HODNĚ zavrhované - typicky je příkladem té "dřevní" alokační strategie funkce scanf() - která je dnes už taky mezi C programátory naprosto "deprecated", zavrhovaná.
moje alokační strategie je prostě jen paralelou situace, kdy na všechny pointery, které nevracíš jako návratovou hodnotu, zavoláš na konci free(): moje makra nebudou řešit nic jiného, než aby se na všechny použité memory pooly to free zavolalo samo (a popravdě - možná dokonce bude pro každý ten "kontext" memory pool jenom jeden a v případě potřeby bude zvětšovaný tím realloc() ... tedy i free() se zavolá pro libovolný počet pointerů jen jednou).
Dobře - možná je to celé pitomost, ale pojďte se bavit o jiných důvodech, proč je to pitomost, než je ten, že jsem s tím přišel já :-)