Różnice między wybraną wersją a wersją aktualną.
Next revision | Previous revision | ||
wlasne_funkcje_obslugi_braku_pamieci [2008/12/03 22:24] marcinkaczor utworzono |
wlasne_funkcje_obslugi_braku_pamieci [2008/12/03 22:54] (aktualna) marcinkaczor formatowanie, komentarze |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | /*! | + | ====== Własne funkcje obsługi braku pamięci ====== |
- | * Autor: Marcin Kaczor U3ISI nr albumu: 192641 | + | |
- | * Temat: Obsluga braku pamieci (praca domowa na ZPR) | + | |
- | * | + | |
- | * Problem: Podczas korzystania z dynamicznego przydzialu pamieci w jezyku C++ | + | |
- | * (za pomoca operatora new) jesli nie uda sie zarezerwowac bloku pamieci | + | |
- | * o odpowiednim rozmiarze, to zostanie rzucony wyjatek std::bad_alloc. | + | |
- | * Sprawdzanie czy po każdym wywolaniu new nie zostal rzucony wyjatek jest | + | |
- | * klopotliwe. Oczywiscie mozna uzywac wersji operatora new, ktora nie rzuca | + | |
- | * wyjatkiem new (std::nothrow) Typ, ale wtedy pomijamy obsługę błędów. | + | |
- | * | + | |
- | * Opis: Bilbioteka standardowa udostepnia mozliwosc zdefiniowania wlasnej funkcji | + | |
- | * obslugi braku pamieci za pomoca funkcji z biblioteki standardowej set_new_handler(). | + | |
- | * Funkcja obslugi braku pamieci powinna uzyskac wiecej pamieci, rzucic wyjatek, | + | |
- | * przerwac program lub chociaz ustawic inna funkcje obslugi (lub odinstalowac | + | |
- | * obecna), bo program bedzie sie wykonywal w nieskonczonej petli. | + | |
- | * | + | |
- | * Zastosowanie: Glownym zadaniem funkcji obslugi braku pamieci jest uzyskanie | + | |
- | * wiekszej ilosci pamieci (np. przez usuniecie nieuzywanych obiektow) tak aby | + | |
- | * aplikacja mogla dzialac dalej, czasami jest to niemozliwe, funkcja ta jest tez | + | |
- | * przydatna gdy nie chcemy przy kazdym tworzeniu nowego obiektu obslugiwac | + | |
- | * wyjatku bad_alloc, w ten sposob, gdy juz wystapi problem braku pamieci mozemy | + | |
- | * to obsluzyc w jednym miejscu i zamknac aplikacje w mniej brutalny sposob, mamy | + | |
- | * szanse na pozamykanie polaczen, plikow oraz poinformowanie uzytkownika o tym co | + | |
- | * sie stalo. | + | |
- | * | + | |
- | * Przyklad: Nizej zostanie przedstawiony przyklad klasy reprezentujacej obiekty | + | |
- | * zajmujace duzo pamieci, obiekty beda rejestrowane w rejstrze przez ktory tez | + | |
- | * jest mozliwy do nich dostep, rejestr bedzie usuwac obiekty gdy bedzie | + | |
- | * potrzebna pamiec. | + | |
- | */ | + | |
+ | === Autor: Marcin Kaczor === | ||
+ | |||
+ | **Problem**: Podczas korzystania z dynamicznego przydziału pamięci w języku C++ (za pomocą operatora new) jeśli nie uda się zarezerwować bloku pamięci o odpowiednim rozmiarze, to zostanie rzucony wyjątek **std::bad_alloc**. Sprawdzanie czy po każdym wywołaniu new nie został rzucony wyjątek jest kłopotliwe. Oczywiście można używac wersji operatora new, która nie rzuca wyjątkiem **new (std::nothrow)** Typ, ale wtedy pomijamy obsługę błędów. | ||
+ | |||
+ | **Opis**: Biblioteka standardowa udostępnia możliwość zdefiniowania własnej funkcji obsługi braku pamięci za pomocą funkcji z biblioteki standardowej **set_new_handler()**. Funkcja obsługi braku pamięci powinna uzyskać więcej pamięci, rzucić wyjątek, przerwać program lub chociaż ustawić inna funkcje obsługi (lub odinstalować obecna), bo program będzie się wykonywał w nieskończonej pętli. | ||
+ | |||
+ | **Zastosowanie**: Głównym zadaniem funkcji obsługi braku pamięci jest uzyskanie większej ilości pamięci (np. przez usuniecie nieużywanych obiektów) tak aby aplikacja mogla działać dalej, czasami jest to niemożliwe, funkcja ta jest tez przydatna gdy nie chcemy przy każdym tworzeniu nowego obiektu obsługiwać wyjątku bad_alloc, w ten sposób, gdy już wystąpi problem braku pamięci możemy to obsłużyć w jednym miejscu i zamknąc aplikacje w mniej brutalny sposób, mamy szanse na pozamykanie połączeń, plików oraz poinformowanie użytkownika o tym co | ||
+ | się stało. | ||
+ | |||
+ | **Przyklad**: Niżej zostanie przedstawiony przykład klasy reprezentującej obiekty zajmujące dużo pamięci, obiekty będą rejestrowane w rejestrze przez który tez jest możliwy do nich dostęp, rejestr będzie usuwać obiekty gdy będzie potrzebna pamięć. | ||
+ | |||
+ | Kod: | ||
+ | Dołączenie nagłówków, deklaracje... | ||
+ | <code c++> | ||
#include <new> // zawiera funkcje set_new_handler | #include <new> // zawiera funkcje set_new_handler | ||
#include <iostream> // obiekty cout, cerr, etc. | #include <iostream> // obiekty cout, cerr, etc. | ||
Linia 41: | Linia 25: | ||
// deklaracja klasy Register potrzebna klasie BigSize | // deklaracja klasy Register potrzebna klasie BigSize | ||
class Register; | class Register; | ||
+ | </code> | ||
+ | |||
+ | Klasa BigSize reprezentuje duże obiekty, które alokujemy dynamicznie. | ||
+ | <code c++> | ||
//! Klasa BigSize | //! Klasa BigSize | ||
/*! | /*! | ||
Linia 74: | Linia 62: | ||
char buffer_[BS_SIZE]; | char buffer_[BS_SIZE]; | ||
}; | }; | ||
+ | </code> | ||
+ | Klasa Register zarządzająca obiektami klasy BigSize. W tym przykładzie gdy zostanie o to poproszona usuwa wszystkie obiekty klasy BigSize, ale można ją urozmaicić o licznik odwołań lub czas ostatniego odwołania do poszczególnych obiektów i usuwać ostatnio nieużywane obiekty lub rzadko używane. | ||
+ | |||
+ | <code c++> | ||
//! Klasa Register | //! Klasa Register | ||
/*! | /*! | ||
Linia 132: | Linia 124: | ||
std::vector<BigSize *> objects_; /**< wektor obiektow */ | std::vector<BigSize *> objects_; /**< wektor obiektow */ | ||
}; | }; | ||
+ | </code> | ||
+ | Funkcja obsługi braku pamięci, w tym przykładzie nieużywana, ale pokazuje, że można mieć więcje niż jedną funkcję obsługi braku pamięci i mogą mieć one różne zadania, ta stara się logować powód zamknięcia aplikacji i wychodzi z aplikacji z błędem. | ||
+ | <code c++> | ||
//! Funkcja obslugi braku pamieci, zamyka awaryjnie aplikacje | //! Funkcja obslugi braku pamieci, zamyka awaryjnie aplikacje | ||
void KillApplication() | void KillApplication() | ||
Linia 141: | Linia 135: | ||
exit(1); | exit(1); | ||
} | } | ||
+ | </code> | ||
+ | Funkcja obsługi braku pamięci, zajmuje się zwalnianiem nieużywanej pamięci. | ||
+ | <code c++> | ||
//! Funkcja obslugi braku pamieci, sprzata pamiec | //! Funkcja obslugi braku pamieci, sprzata pamiec | ||
void CleanUpMemory() | void CleanUpMemory() | ||
Linia 154: | Linia 150: | ||
// ale w tym przykladzie dzialalby w petli nieskonczonej, dlatego zostanie zamkniety | // ale w tym przykladzie dzialalby w petli nieskonczonej, dlatego zostanie zamkniety | ||
} | } | ||
- | + | </code> | |
+ | Funkcja main, ustawia nową funkcję obsługi braku pamięci i zajmuje pamięć. | ||
+ | <code c++> | ||
int main () | int main () | ||
{ | { | ||
Linia 164: | Linia 161: | ||
return 0; | return 0; | ||
} | } | ||
+ | </code> |