home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Ebooks / Thinking in C++ V2 / C13 / Framis.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-25  |  1.8 KB  |  66 lines

  1. //: C13:Framis.cpp
  2. // From Thinking in C++, 2nd Edition
  3. // Available at http://www.BruceEckel.com
  4. // (c) Bruce Eckel 1999
  5. // Copyright notice in Copyright.txt
  6. // Local overloaded new & delete
  7. #include <cstddef> // Size_t
  8. #include <fstream>
  9. #include <new>
  10. using namespace std;
  11. ofstream out("Framis.out");
  12.  
  13. class Framis {
  14.   static const int sz = 10;
  15.   char c[sz]; // To take up space, not used
  16.   static unsigned char pool[];
  17.   static unsigned char alloc_map[];
  18. public:
  19.   static const int psize = 100;  // frami allowed
  20.   Framis() { out << "Framis()\n"; }
  21.   ~Framis() { out << "~Framis() ... "; }
  22.   void* operator new(size_t) throw(bad_alloc);
  23.   void operator delete(void*);
  24. };
  25. unsigned char Framis::pool[psize * sizeof(Framis)];
  26. unsigned char Framis::alloc_map[psize] = {0};
  27.  
  28. // Size is ignored -- assume a Framis object
  29. void* Framis::operator new(size_t) 
  30.   throw(bad_alloc) {
  31.   for(int i = 0; i < psize; i++)
  32.     if(!alloc_map[i]) {
  33.       out << "using block " << i << " ... ";
  34.       alloc_map[i] = 1; // Mark it used
  35.       return pool + (i * sizeof(Framis));
  36.     }
  37.   out << "out of memory" << endl;
  38.   throw bad_alloc();
  39. }
  40.  
  41. void Framis::operator delete(void* m) {
  42.   if(!m) return; // Check for null pointer
  43.   // Assume it was created in the pool
  44.   // Calculate which block number it is:
  45.   unsigned long block = (unsigned long)m
  46.     - (unsigned long)pool;
  47.   block /= sizeof(Framis);
  48.   out << "freeing block " << block << endl;
  49.   // Mark it free:
  50.   alloc_map[block] = 0;
  51. }
  52.  
  53. int main() {
  54.   Framis* f[Framis::psize];
  55.   for(int i = 0; i < Framis::psize; i++)
  56.     f[i] = new Framis;
  57.   new Framis; // Out of memory
  58.   delete f[10];
  59.   f[10] = 0;
  60.   // Use released memory:
  61.   Framis* x = new Framis;
  62.   delete x;
  63.   for(int j = 0; j < Framis::psize; j++)
  64.     delete f[j]; // Delete f[10] OK
  65. } ///:~
  66.