/**
* 书本:【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;
}

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

  1. 重载new和delete来检测内存泄漏

    重载new和delete来检测内存泄漏 1. 简述 内存泄漏属于资源泄漏的一种,百度百科将内存泄漏分为四种:常发性内存泄漏.偶发性内存泄漏.一次性内存泄漏和隐式内存泄漏.    常发性指:内存泄漏的代 ...

  2. C++重载new和delete运算符

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

  3. 重载new和delete

    当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...

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

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

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

    重载new,delete运算符 new,delete在c++中也被归为运算符,所以可以重载它们. new的行为: 先开辟内存空间 再调用类的构造函数 开辟内存空间的部分,可以被重载. delete的行 ...

  6. C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)

    重载new和delete 1调用operator new( 或new[])标准库函数分配足够大的.原始的.未命名的内存空间以便存储特定类型的对象 2编译器运行相应地构造函数以构造这些对象,并为其传入初 ...

  7. 重载全局new/delete实现内存检测

    下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator ...

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

    动态对象创建(二)重载new和delete 前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常 ...

  9. 重载operator new delete函数

    可以重载global的operator new delete 函数,细节如下: MyNewDelete.h #pragma once #include <stdlib.h> #includ ...

随机推荐

  1. [转]MySQL数据库的热备份

    一.系统环境描述:      1.两台数据库服务器,A和B:      2.当前A正在使用,将作为主服务器,B为准备用来做备用数据库服务器:      3.要进行热备份的数据库中含有类型为MyISAM ...

  2. web项目环境搭建(1):建立一个maven项目

    一.maven简介以及常用概念 1.Maven是一个项目管理和整合的工具.Maven为开发者提供了一套完整的构建生命周期框架.开发团队基本不用花多少时间就能自动完成工程的基础构建配置,因为Maven使 ...

  3. 快速幂:quickpow

    众所周知,快速幂是优化对数的次方运算的最普遍手段.在学习快速幂的思想时,其分治思想容易让大家用简单的递归实现. 但其实,除了递归之外,更好的方法会是简单的 WHILE循环.下面贴代码: #includ ...

  4. 记一次MySQl 安装1067错误

    1.今天阿里云windows server 2008 r2服务器上安装mysql,配置完发现无法启动mysql服务(并发设置的是500),查询windows日志提示 Unknown/unsupport ...

  5. javascript模块

    //使用模块 template = {}; template.createObj = (function(){ //私有成员 var _age = ""; var _name = ...

  6. 利用js得到某个范围内的整数随机数

    Math.random()方法可以返回(0,1)之间的随机数,不包括0和1. 套用公式:Math.floor(Math.random()*可能的值的总数+第一个可能的值) 如得到(3,9]之间的随机数 ...

  7. CentOS下建立本地YUM源并自动更新

    1. 尽管有很多的免费镜像提供yum源服务,但是还是有必要建立自己的yum服务器,主要出于以下几点考虑: l 网络速度:访问互联网可能比较慢 l 节省带宽:如果有大量的服务器,架设自己的yum源可以有 ...

  8. 基于.NET MVC的高性能IOC插件化架构(一)

    最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博文是我的各大IOC框架的性能测试:http:/ ...

  9. JS--图片轮播效果

    搞了很长时间才弄清楚图片轮播效果的原理,理解各个事件发生的原因,浪费了这么长的时间,只怪自己的知识太过于薄弱.现将代码写下,供大家参看,如有不妥之处还望指出,大家一起学习. 功能: 1.点击左右两边的 ...

  10. 完全教程 Aircrack-ng来PJ---WEP、WPA-PSK--加密利器

    恩,先说明一下,本章的内容适用于目前市面所有主流品牌无线路由器或AP如Linksys.Dlink.TPLink.BelKin等.涉及内容包括了WEP加密及WPA-PSK加密的无线网络的破解操作实战. ...