【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;
}
【ThinkingInC++】64、重载new和delete,来模仿内存的分配的更多相关文章
- 重载new和delete来检测内存泄漏
重载new和delete来检测内存泄漏 1. 简述 内存泄漏属于资源泄漏的一种,百度百科将内存泄漏分为四种:常发性内存泄漏.偶发性内存泄漏.一次性内存泄漏和隐式内存泄漏. 常发性指:内存泄漏的代 ...
- C++重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
- 重载new和delete
当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...
- C++学习32 重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
- c/c++ 重载new,delete运算符 placement new
重载new,delete运算符 new,delete在c++中也被归为运算符,所以可以重载它们. new的行为: 先开辟内存空间 再调用类的构造函数 开辟内存空间的部分,可以被重载. delete的行 ...
- C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)
重载new和delete 1调用operator new( 或new[])标准库函数分配足够大的.原始的.未命名的内存空间以便存储特定类型的对象 2编译器运行相应地构造函数以构造这些对象,并为其传入初 ...
- 重载全局new/delete实现内存检测
下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator ...
- 动态对象创建(二)重载new和delete
动态对象创建(二)重载new和delete 前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常 ...
- 重载operator new delete函数
可以重载global的operator new delete 函数,细节如下: MyNewDelete.h #pragma once #include <stdlib.h> #includ ...
随机推荐
- js添加onclick函数
document.getElementById('Add').setAttribute("onclick",AddNum()); 相当于不停的调用Addnum函数 应改成docum ...
- java rmi 小记
最近在搞Quartz任务监控管理,碰到了jmx,后来发现Quartz对jmx的支持不是很好,介绍的文档也比较少,另外Quartz可以很方便的支持rmi于是就看了一下rmi.下面把写的一些测试小例子附上 ...
- xcode 删除 Provisioning Profile
provisioning profile path: ~/Library/MobileDevice/Provisioning Profiles 打开并日期排序,删除老的 provisioning pr ...
- 武汉科技大学ACM:1004: 零起点学算法36——3n+1问题
Problem Description 任给一个正整数n,如果n为偶数,就将它变为n/2,如果为奇数,则将它乘3加1(即3n+1).不断重复这样的运算,经过有限步后,一定可以得到1 . Input 输 ...
- Win+PHP+IECapt完整实现网页批量截图并创建缩略图
最近在开发一个本地互联网应用的项目,为了增加用户体验,需要在搜索结果左侧显示如图一所示的某个网站的缩略图效果,在网上不停地百度谷歌了一上午后,发现大多数实现少量截图还是可以的,如果大批量的截图总会在中 ...
- 监听<input/>标签行为的方法总结
一.内容改变 1.<input onchange="javascript:function()"/>方法 onchange可以替换为下面几种:oninput,onpro ...
- HTML5 Canvas 中的颜色、样式和阴影的属性和方法
颜色.样式和阴影的属性与方法 fillStyle 设置或返回用于填充绘画的颜色.渐变或模式 strokeStyle 设置或返回用于笔触的颜色.渐变或模式 ...
- Phpcms v9系统类库与函数库调用方法
在分享了n多phpcms的教程后,cmsyou继续分享关于phpcms v9系统类库与函数库的调用方法. 系统类库位于系统的 /libs/functions目录下面,函数库文件名为*.func.php ...
- phpmyadmin密码字段加密方法
UPDATE member SET password=md5('password')
- 大整数算法[09] Comba乘法(原理)
★ 引子 原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...