【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()\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};  //全部初始化为没有被分配,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;
}

时间: 2024-10-05 15:01:35

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

动态对象创建(二)重载new和delete

前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常我们为了一些目的而使用new和delete的内存分配系统,但是在特殊情况下,它并不能够满足需要.最常见的改变分配系统的原因是出于效率考虑:也许要创建和销毁一个特定的类的非常多的对象以至于这个运算变成了速度的瓶颈.C++允许重载new和delete来实现我们自己的存储分配方案,所以可以用它来处理问题. 另一个问题就是堆碎片:分配不同大小的内存可

C++学习32 重载new和delete运算符

内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内存时才会重载. 重载 new 有两种形式: //以类的成员函数的形式进行重载 void * 类名::operator new ( size_t size ){ //TODO: } 和 //以全局函数的形式进行重载 void * operator new ( size_t size ){ //TODO

c/c++ 重载new,delete运算符 placement new

重载new,delete运算符 new,delete在c++中也被归为运算符,所以可以重载它们. new的行为: 先开辟内存空间 再调用类的构造函数 开辟内存空间的部分,可以被重载. delete的行为: 先调用类的析构函数 再释放内存空间 释放内存空间的部分,可以被重载. 为什么要要重载它们? 有时需要实现内存池的时候需要重载它们.频繁的new和delete对象,会造成内存碎片,内存不足等问题,影响程序的正常执行,所以一次开辟一个适当大的空间,每次需要对象的时候,不再需要去开辟内存空间,只需要

【c++ primer】【19.1.1】重载new和delete

尽管我们能说“重载new和delete”,但是实际上重载这两个运算符和重载其它运算符的过程大不相同.要想真正掌握重载new和delete的方法,首先需要对new表达式和delete表达式的工作机理有更多了解. 当我们使用new表达式时: //new表达式 string *sp = new string("a value"); //分配并初始化一个string对象 string *arr = new string[10]; //分配10个默认初始化的string对象 实际上执行了三个操作

重载operator new delete函数

可以重载global的operator new delete 函数,细节如下: MyNewDelete.h 1 #pragma once 2 #include <stdlib.h> 3 #include <string> 4 #include <iostream> 5 using namespace std; 6 7 class Foo 8 { 9 public: 10 int id; 11 string str; 12 13 Foo() : id(0) { cout

new和delete在高级内存管理中的应用

#include <iostream> using namespace std; //new 的本质还是malloc delete 的本质是free //delete new 最底层就是free malloc //delete new 提供了重载的机制(官方说法),通俗的理解就是劫持 //delete new 全局重载,只要分配内存都劫持 //内存防泄漏系统,内存反复释放,进制创建,禁止销毁 //delete new 局部重载,只影响本类型,只要分配内存就劫持 //内存防泄漏系统,内存反复释放

C++ 重载new和delete

下边代码对new和delete进行了简单的重载: #include <memory> #include <iostream> #include <cstddef> using namespace std; class TraceHeap { int i; public: static void* operator new(size_t siz) { void* p = ::operator new(siz); cout << "Allocating

C++中基于Crt的内存泄漏检测(重载new和delete,记录在Map里)

尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. #ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#include <crtdbg.h>#ifdef _DEBUG#define new DEBUG_CLIENTBLOCK#endif int _t

【ThinkingInC++】65、使用delete void*可能会出错

/** * 书本:[ThinkingInC++] * 功能:使用delete void*可能会出错 * 时间:2014年10月5日14:31:43 * 作者:cutter_point */ #include <iostream> using namespace std; class Object { void* data; //一个void*类型的指针 const int size; const char id; public: Object(int sz, char c) : size(sz