zoukankan      html  css  js  c++  java
  • 【ThinkingInC++】64、重载new和delete,来模仿内存的分配

    /**
    * 书本:【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()
    ";}
        ~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};  //所有初始化为没有被分配,false
    
    void* 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;
    }
    
    
    

  • 相关阅读:
    NEO发行资产Token
    OSCP考试回顾
    Windows降权
    Mimikatz.ps1本地执行
    MS16-032提权正确方法
    一种通过HTTP传文件出网的姿势
    mac chromedriver error
    关于websocket 在生产环境中遇到的问题 及 解决办法
    how to install protobuff python
    Git 使用疑问
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5258894.html
Copyright © 2011-2022 走看看