⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framis.cpp

📁 Think in C++ 第二版源码
💻 CPP
字号:
//: C13:Framis.cpp

// From Thinking in C++, 2nd Edition

// Available at http://www.BruceEckel.com

// (c) Bruce Eckel 1999

// Copyright notice in Copyright.txt

// Local overloaded new & delete

#include <cstddef> // Size_t

#include <fstream>

#include <new>

using namespace std;

ofstream out("Framis.out");



class Framis {

  static const int sz = 10;

  char c[sz]; // To take up space, not used

  static unsigned char pool[];

  static unsigned char alloc_map[];

public:

  static const int psize = 100;  // frami allowed

  Framis() { out << "Framis()\n"; }

  ~Framis() { out << "~Framis() ... "; }

  void* operator new(size_t) throw(bad_alloc);

  void operator delete(void*);

};

unsigned char Framis::pool[psize * sizeof(Framis)];

unsigned char Framis::alloc_map[psize] = {0};



// Size is ignored -- assume a Framis object

void* Framis::operator new(size_t) 

  throw(bad_alloc) {

  for(int i = 0; i < psize; i++)

    if(!alloc_map[i]) {

      out << "using block " << i << " ... ";

      alloc_map[i] = 1; // Mark it used

      return pool + (i * sizeof(Framis));

    }

  out << "out of memory" << endl;

  throw bad_alloc();

}



void Framis::operator delete(void* m) {

  if(!m) return; // Check for null pointer

  // Assume it was created in the pool

  // Calculate which block number it is:

  unsigned long block = (unsigned long)m

    - (unsigned long)pool;

  block /= sizeof(Framis);

  out << "freeing block " << block << endl;

  // Mark it free:

  alloc_map[block] = 0;

}



int main() {

  Framis* f[Framis::psize];

  for(int i = 0; i < Framis::psize; i++)

    f[i] = new Framis;

  new Framis; // Out of memory

  delete f[10];

  f[10] = 0;

  // Use released memory:

  Framis* x = new Framis;

  delete x;

  for(int j = 0; j < Framis::psize; j++)

    delete f[j]; // Delete f[10] OK

} ///:~

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -