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

Both sides previous revision Previous revision
wlasne_funkcje_obslugi_braku_pamieci [2008/12/03 22:32]
marcinkaczor formatowanie
wlasne_funkcje_obslugi_braku_pamieci [2008/12/03 22:54]
marcinkaczor formatowanie, komentarze
Linia 1: Linia 1:
-=== Własne funkcje obsługi braku pamięci ===+====== Własne funkcje obsługi braku pamięci ​======
  
-==Marcin Kaczor ​U3ISI nr albumu: 192641 ​==+=== Autor: ​Marcin Kaczor ​===
  
-Problem: Podczas korzystania z dynamicznego ​przydzialu pamieci ​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 klopotliweOczywiscie mozna uzywac ​wersji operatora new, ktora nie rzuca wyjatkiem ​new (std::​nothrow) Typ, ale wtedy pomijamy obsługę błędów.+**Problem**: Podczas korzystania z dynamicznego ​przydziału pamięci ​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łopotliweOczywiś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: Bilbioteka ​standardowa ​udostepnia mozliwosc ​zdefiniowania ​wlasnej ​funkcji +**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ęcirzucić wyjątekprzerwać ​program lub chociaż ustawić ​inna funkcje ​obsługi ​(lub odinstalować ​obecna), bo program ​będzie się wykonywał ​nieskończonej pętli.
-obslugi ​braku pamieci ​za pomoca ​funkcji z biblioteki standardowej set_new_handler(). +
-Funkcja ​obslugi ​braku pamieci ​powinna ​uzyskac wiecej pamiecirzucic wyjatek, +
-przerwac ​program lub chociaz ustawic ​inna funkcje ​obslugi ​(lub odinstalowac +
-obecna), bo program ​bedzie sie wykonywal ​nieskonczonej petli.+
  
-Zastosowanie: ​Glownym ​zadaniem funkcji ​obslugi ​braku pamieci ​jest uzyskanie ​ +**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 
-wiekszej ilosci pamieci ​(np. przez usuniecie ​nieuzywanych obiektow) tak aby +się stało.
-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 ​polaczenplikow ​oraz poinformowanie ​uzytkownika ​o tym co +
-sie stalo.+
  
-Przyklad: ​Nizej zostanie przedstawiony ​przyklad ​klasy reprezentujacej ​obiekty +**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ęć.
-zajmujace duzo pamieci, obiekty ​beda rejestrowane w rejstrze ​przez ktory tez +
-jest mozliwy ​do nich dostep, rejestr ​bedzie usuwac ​obiekty gdy bedzie +
-potrzebna ​pamiec.+
  
 +Kod:
 +Dołączenie nagłówków,​ deklaracje...
 <code c++> <code c++>
 #include <​new> ​              // zawiera funkcje set_new_handler #include <​new> ​              // zawiera funkcje set_new_handler
Linia 36: 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 69: 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 127: 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 136: 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 149: 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 ()
 { {
wlasne_funkcje_obslugi_braku_pamieci.txt · ostatnio zmienione: 2008/12/03 22:54 przez marcinkaczor