【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 ...
随机推荐
- UITableView初始
近期在自学IOS,看了黑马提供的视频,讲的很好.在此做些笔记,以供以后查阅.注明了知识来源应该不算侵权吧. 一 UITableView 1,数据展示的条件 1⃣️ UITableView的所有数据都是 ...
- CRT内存调试标记
static unsigned char _bNoMansLandFill = 0xFD; /* fill no-man's land with this */ static unsigned cha ...
- mysql 5.5 升级到 mysql 5.6
目前MySQL数据库软件升级到5..26版本,主要有两种方法.一种是停机升级,即在现有环境下先停止数据库,然后升级数据库软件版本和数据库版本:另外一种是采用不停机的主从升级(master--slave ...
- 1.3.1 switch 语句中的 String
switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ...
- image转文件
UIImage *image = self.imageCompainPhoto.image; NSData *imageData = UIImagePNGRepresentation(image); ...
- linux笔记2.19
压缩一般使用 tar -cvzf etcbackup.tar.gz /etc 寻找文件 locate(快速查找:新添加的得用updatedb更新后才能找到) find: find . -name ...
- 监视系统3389的VBS脚本
Title: 监视系统3389的VBS脚本 --2010-10-27 19:56 从网上找的,不知道是不是NP写的那个 ---------------------------------------- ...
- POSTGRESQL小玩
因为CDH上需要用它来建HIVE的元库... 参考: http://www.cnblogs.com/mchina/archive/2012/06/06/2539003.html 一.简介 Postgr ...
- XAMPP的Apache服务器无法正常启动解决方案
XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包.介绍什么的,参见百度百科http://baike.baidu.com/link?url=-UE ...
- hibernate 映射<五>多对多双向映射
多对多映射,可以分单向映射和双向映射.无论是单向还是多向那一方维护,还是双方维护,生成的表结构是一样的. 订单order和产品product是对多对的关系,就是多个订单可以对应多个产品,多个产品也可以 ...