Cześć,
tak się zastanawiam. Pisząc aplikację bez użycia jakichś inteligentnych wskaźników, tylko zwykłych jeżeli stworzymy jakiś obiekt.
Cos* obiekt = new Cos();
//(...) jakieś operacje
delete obiekt;
to jeśli w trakcie tych jakichś operacji poleci jakiś wyjątek, to mamy wyciek pamięci? Bo nie zwolniliśmy pamięci sami.
Rozwiązanie jakie mi przyszło do głowy to po prostu try-catch ale z drugiej strony jeśli tworzymy tych obiektów np 100 różnych,
to potem w catchu sprawdzać tą setkę, który należy zwolnić to chyba też nie jest szczęśliwy pomysł.
To jest taki mankament, który jeszcze mnie wstrzymuje przy próbie zrozumienia pracy ze wskaźnikami.
Mógłby mi ktoś wytłumaczyć jak to działa, jak się ustrzec przed powyższym? Tzn jak to obsłużyć żeby nie mieć leaka.
Jeśli masz 100 obiektów to prawdopodobnie źle zaprojektowałeś algorytm i używasz jednej dużej
funkcji, zamiast 10ciu małych. Podziel na małe procedury, stanie się dużo łatwiej. Jeśli specyfika
Twojego programu wymaga skomplikowanej analizy tego co zostało niepotrzebnie zaallokowane,
to zaprojektuj specjalną strukturę do tego celu, np. listę. Wtedy w sekcji catch przeglądasz
listę i zwalniasz w jednej prostej pętli. Możesz też zwalniać po sekcji catch.
Allocated all;
try {
Obj1 obj1;
Obj2 obj2;
//itd
all.append( obj1 = new Obj1() );
//jakieś operacje;
all.append( obj2 = new Obj2() );
//itd
} catch(...) {
// obsługa samego błędu
}
while( next = all() )
delete next;
}
Generalnie: jeśli jakakolwiek operacja jest skomplikowana w implementacji, to trzeba przygotować
zestaw struktur/procedur do jej obsługi.