W efekcie powstanie wyciek pamięci.

Aby zaradzić takiej sytuacji i obronić się przed wyciekiem pamięci stosuje się dodatkową klasę, w konstruktorze której przypisuje się alokowany wskaźnik, a w destruktorze zwalnia się alokowany obszar pamięci:

class KlasaZasobu { // definicja klasy

void pracaZzasobem( KlasaZasobu* dana ) { // implementacja funkcji

class KlasaPomocnicza { public: KlasaPomocnicza( KlasaZasobu* wskaznik ) { this->dana = wskaznik;

KlasaZasobu* pobierzWskaznik() { return this->dana;

~KlasaPomocnicza() { delete this->dana;

private: KlasaZasobu* dana;

void funkcja() { KlasaPomocnicza zasob( new KlasaZasobu() ); // 1 pracaZzasobem( zasob.pobierzWskaznik() ); // 2

W (1) następuje stworzenie lokalnego obiektu klasy KlasaPomocnicza i podanie w konstruktorze wskaźnika do nowo alokowanego obszaru pamięci. Konstruktor ten przypisuje polu dana wskaźnik nowo alokowanego obszaru. Następnie zostaje wywołana funkcja pracaZzasobem( KlasaZasobu* ), której jako parametr podajemy wskaźnik, korzystając z funkcji w klasie KlasaPomocnicza. Gdy funkcja pracaZzasobem( KlasaZasobu* ) wywoła wyjątek, zostaną usunięte wszystkie obiekty lokalne. W tym wypadku obiektem lokalnym jest obiekt zasob, dla którego zostanie wywołany jego destruktor, w którym nastąpi zwolnienie alokowanego zasobu.