/**
* 书本:【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. ACM中常用的C/C++函数

    只大概说明功能,具体用法请自行百度. C函数 memset:按字节填充地址空间 sscanf:从一个字符串中格式化读取变量 sprintf:将变量格式化写入字符串中 atoi:字符串转int atof ...

  2. Swift—Cocoa错误处理模式-备

    Swift错误处理模式,在Swift1.x和Swift 2.0是不同的两种模式. Swift 1.x代码错误处理模式采用Cocoa框架错误处理模式,到现在Objective-C还沿用这种处理模式,而S ...

  3. debug 输出 以及宏定义--备

    使用NSLog的一个风险是:它的运行会占用时间和设备资源. 所以在编译版本前一定不要有nslog. 同时当你的工程中有很多log 输出的时候 查找起来很不方便 ,下面介绍一种方法 可以使我们事半功倍. ...

  4. ubuntu14.04使用reaver跑pin码

    今天刚说过没找到支持ubuntu14.04用reaver跑pin的旧版库文件这就有摸索到方法了... 另外安装系统ubuntu14.04以及一系列破解工具比如aircrack,minidwep等都不在 ...

  5. 1像素HR技巧(兼容各浏览器)

    hr{color:#ccc;height:1px;border:0px;border-top:1px solid #ccc;margin:0px;padding:0px;overflow:hidden ...

  6. cf C. Maze

    http://codeforces.com/problemset/problem/378/C #include <cstdio> #include <cstring> #inc ...

  7. JBOSS尝鲜

    环境搭建:1. jdk-6u16-windows-i586.exe2. jboss-5.1.0.GA-jdk6.zip JDK安装: 安装过程很简单,应该都知道怎么安装软件....安装完JDK后,需要 ...

  8. 我想要个pc和手机共有的客户端,就像百度云(iBarn网盘好用)

    https://github.com/zhimengzhe/iBarn iBarn网盘是一个基于PHP开发的先进的云存储系统,提供文件的网络备份,同步和分享服务:支持断点续传,秒传等功能:可选择文件下 ...

  9. android中对线程池的理解与使用

    前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...

  10. Findbugs初探-使用idea获取findbugs插件

    /* * 整天忙于无限重复的黑盒测试,不论是写脚本,还是手工测,都难以脱离黑&&灰盒测试,所以忽然间想,大学时期学过的所有课程就这样扔掉吗?不好!既然选择了做测试,那么就要一直坚持下去 ...