【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 ...
随机推荐
- 《CSS网站布局实录》学习笔记(二)
第二章 XHTML与CSS基础 2.1 XHTML基础 XHTML是网页代码的核心内容,标准XHTML代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- SQL从入门到基础 - 01 数据库开发及ADO.Net
一.数据库概述 1. 用自定义文件格式保存数据的劣势:并发性差,查找数据的速度差. 2. DBMS(DataBase Management System数据库管理系统)和数据库.平时谈到“数据库”的含 ...
- Android v2.0 基本概念 - 浅谈
目录 Android框架 Linux Kernel 系统运行库 Libraries Android Runtime Application Framework Application Android框 ...
- java分布式开发,什么是分布式开发
就是同一个服务,把数据库的不同部分分开建立到不同的服务器上.以缓解数据库大量数据访问的压力.很多大公司的业务量比较大,每天的访问量都达到几百万上千万,甚至上亿的访问量,在访问量不是很大的情况下,是可以 ...
- 第一次启动MySQL时报错
[root@localhost~]#/usr/local/webserver/mysql/bin/mysql_install_db --basedir=/usr/local/webserver/mys ...
- uva10020 贪心
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- wdcp/wdlinux 常用工具及命令集
强制修改Mysql的root密码,在忘记mysql密码时有用 sh /www/Wdlinux/tools/mysql_root_chg.sh ftp配置文件检查,在FTP不能连接或登录时有用sh /w ...
- thinkphp基础入门(1)
ThinkPHP目录如下,Application顾名思义就是应用的意思(我们的代码放在这里),Public就是公共文件的意思(主要放JS CSS 等前端资源文件),ThinkPHP文件是框架的核心包( ...
- JQuery 获取验证码倒计时
HTML代码: <button id="btn">点击获取验证码</button> Jquery:代码: $(document).ready(functio ...
- php 编译安装curl 时候出现问题
/usr/bin/ld: ext/curl/.libs/interface.o: undefined reference to symbol 'CRYPTO_set_id_callback@@OPEN ...