【ThinkingInC++】64、重载new和delete,来模仿内存的分配
来源:互联网 发布:ipadmini淘宝试用在哪 编辑:程序博客网 时间:2024/05/16 02:55
/*** 书本:【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}; //全部初始化为没有被分配,falsevoid* 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;}
0 0
- 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
- 控制内存分配----重载new和delete & 定位new表达式
- c++ 重载 new delete 用堆来分配内存
- new和delete分配内存
- 类和动态内存分配,类成员的动态内存分配,new,delete,定位new
- C++ 方式的内存分配与释放 new 和 delete
- new和delete对结构体分配内存的问题
- c++:动态内存分配(new和delete的使用)
- 动态内存分配- new/delete 和malloc/free的区别
- c++动态内存分配(new/new[]和delete/delete[])
- new和delete与内存分配
- 内存泄露打印new和delete重载
- 重载new和delete,处理内存溢出
- 重载new和delete检测内存泄漏
- 重载New和Delete检测内存泄漏
- 重载new和delete来防止c++工程中内存泄漏
- 重载new和delete来防止c++工程中内存泄漏
- 重载new和delete来防止c++工程中内存泄漏
- Socket中send函数的理解(一)
- 应用之间调用 UIApplication类的OpenURL方法
- C++求n个字符的长度为m的组合
- 如何从用户体验的角度去做一个网站的页面设计
- 写给开发者:记录日志的10个建议
- 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
- Java学习笔记1:考虑用静态工厂方法代替构造器
- INS-30001 ADMIN口令为空
- 狄拉克δ函数,冲激响应
- Android_BaseAdapter排列基础_141004
- 【ThinkingInC++】65、使用delete void*可能会出错
- Android_Bundle传回数据_141005
- linux命令之挂载windows 7 的共享文件夹
- Java学习笔记2:当构造方法有多个参数时考虑使用Builder