Je sice pěkné, že je tu hezký a rychlý způsob výpisu seznamu alokované paměti (a to pamatuju třeba z Visual C++), ale tento přístup rozhodně neřeší otázku vzniku, jako např. vznik memory leaků při volání výjimek (neodchytnuté výjimky nebo špatné čištění po výjimce).
Ve všech případech (i při volání výjimky) se ruší všechny lokální proměnné. Tohoto jevu se užívá u tzv. chytrých ukazatelů (smart pointers), kteří existují pouze jako lokalní proměnné a udržují si ukazatel na nějaký (libovolný, definice přes template) objekt. Pokud si navíc udržují i počet referencí (nutno definovat kopírovací konstruktor), lze takový chytrý ukazatel vrazet z funkce, předávat jej jako parametr atd. Problémy nastávají u cyklyckých odkazů, kdy jedna třída ukazuje na jinou a obráceně, pro tyto případy se používá slabá vazba (weak) z jedné strany. Není složité ani použití ve vícevláknovém prostředí, kdy stačí ošetřit pouze počítání referencí.
Pro více informací doporučuji google.com (smart-pointers) a naučit se pracovat s templaty (není nic složitého). Už nikdy memory-leaky!!!
A na závěr poznámečku: C++ není nadstavba C, aby se z něj používaly pouze třídy... Hlavní síla je v klíčovém slově template.
Ups, zapomněl jsem připomenout, že daný objekt, na který chytrý ukazatel ukazuje, se ruší zároveň s ukazatelem (tj. platnost jako lokální proměnná) a v případě počítání referencí navíc v situaci, kdy na objekt nikdo neukazuje.
Správa paměti je jakoby automatická (pseudoautomatická pro rejpaly :-)), už žádné explicitní delete (new je stále potřeba jednou při vytváření objektu). Výjimky jsou ošetřeny, už nejsou potřeba žádné složité čištěcí procedury, jestli objekt náhodou byl, nebo nebyl vytvořen.
Reference counting je takovy "garbage collector pro chude".
Ale rozhodne mnohem lepsi nez nic, pamatuji si jak jsem z toho byl kdysi nadseny v Objective C.
Nicmene, existuji skutecne garbage collectory i pro C++