【ThinkingInC++】64、重载new和delete,来模仿内存的分配

来源:互联网 发布:ipadmini淘宝试用在哪 编辑:程序博客网 时间:2024/05/16 02:55
/*** 书本:【ThinkingInC++】* 功能:重载new和delete,来模仿内存的分配* 时间:2014年10月5日14:30:11* 作者:cutter_point*/#include <cstddef>  //size_t这个类型的使用#include <fstream>#include <iostream>#include <new>using namespace std;ofstream out("Framis.txt");class Framis{    enum {sz=10};    static unsigned char pool[];    //这个用力模仿内存池    static bool alloc_map[];    //这个是用来标记已经分配或是没有分配的内存public:    enum {psize=100};    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)];   //这个给内存池设定初始能存放的对象个数bool Framis::alloc_map[psize]={false};  //全部初始化为没有被分配,falsevoid* Framis::operator new(size_t) throw(bad_alloc){    for(int i=0 ; i<psize ; ++i)        if(!alloc_map[i])   //直到遇到第一块没有被分配的空间        {            alloc_map[i]=true;  //标记这块空间已经被使用了            return pool+(i*sizeof(Framis)); //返回分配到哪里了        }    out<<"超出内存"<<endl;    throw bad_alloc();  //抛出异常}void Framis::operator delete(void* m){    if(!m) return;    unsigned long block=(unsigned long)m-(unsigned long)pool;   //m减去起始的地方表示内存的大小    block /=sizeof(Framis); //一共有几个对象要回收    out<<"freeing block "<<block<<endl;    alloc_map[block]=false; //回收要重置为false}int main(){    Framis* f[Framis::psize];    try    {        for(int i=0 ; i<Framis::psize ; ++i)            f[i]=new Framis;        new Framis;    }    catch(bad_alloc)    {        cerr<<"超出内存"<<endl;    }    delete f[10];    f[10]=0;    Framis* x=new Framis;    delete x;   //这里回收的会是f[10] ,后面就不会回收10了    for(int j=0 ; j<Framis::psize ; ++j)        delete f[j];    return 0;}

0 0