Listing 2 Allocating global memory from windows

const unsigned BLOCKSIZE = 60*1024;
const int MAXBLOCK = 64;

class Heap{
  void far* block[MAXBLOCK] // Array of far
                        // pointers to
                        // memory blocks
  int n;                    // No. of blocks
                        // in use
  unsigned pos;             // Next vacant
                        // position within
                        // current block
  
  public:
  Heap()
    { n = 0;
    }
  ~Heap()
    { for (int i = 0; i<n; i++)
       GlobalFreePtr(block[i]);
    }
  void far* New(unsigned nBytes)
    {
     // Allocate another block if necessary
     if (n == 0 | nBytes > BLOCKSIZE - pos){
       assert(n < MAXBLOCK && nBytes <= BLOCKSIZE);
       block[n++] = GlobalAllocPtr(GHND, BLOCKSIZE);
       assert(block[n-1] != 0);
       pos = 0;
     }
     // Get a pointer from within the current block
     void far* p =
        ((char far*) block[n - 1]) + pos;
     pos += nBytes;
     return p;
    }
};