Narzędzia użytkownika

Narzędzia witryny


wlasne_funkcje_obslugi_braku_pamieci

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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>​
wlasne_funkcje_obslugi_braku_pamieci.1228339491.txt.gz · ostatnio zmienione: 2008/12/03 22:24 przez marcinkaczor