C++ new和delete重载
重载new和delete的格式如下:
void *operator new (size_t size)
{
.......//完成分配工作
return pointer_to_memory;
}
void operator delete(void *p)
{
......//释放由p指向的存储空间
}
1.局部重载new和delete(可以使用成员函数和友元函数两种方式重载)
使用new分配某个重载了new的累的对象空间时,先调用new的重载函数,再调用该类的构造函数,如果该类的构造函数有参数要求,则必须给出对应的实参。
使用了delete释放某个重载了delete的累的对象空间时,先调用类的析构函数,然后再调用重载的delete函数。
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class three_d
{
private:
int x,y,z;
public:
three_d(int a,int b,int c);
~three_d()
{
cout << "Destructing\n";
}
void *operator new(size_t size);
void operator delete(void *p);
friend ostream & operator <<(ostream &stream,three_d obj);
};
three_d::three_d(int a,int b,int c)
{
cout << "Constructing\n";
x = a;
y = b;
z = c;
}
void *three_d::operator new(size_t size)
{
cout << "in threee_d new\n";
return malloc(size);
}
void three_d::operator delete(void *p)
{
cout << "in three_d delete\n" ;
free(p);
}
ostream &operator <<(ostream &os,three_d obj)
{
os << obj.x << ",";
os << obj.y << ",";
os << obj.z << "\n";
return os;
}
int main(int argc,char *argv[])
{
three_d *p = new three_d(1,2,3);
three_d *p1 = new three_d(4,5,6);
if(!p || !p1)
{
cout << "Allocation failure" << endl;
return 1;
}
cout << *p << *p1;
delete p;
delete p1;
int *pnum;
pnum = new int;
*pnum = 0;
cout << "num = " << *pnum << endl;
delete pnum;
cout << "Application Run Successfully!" << endl;
return 0;
}
2.全局重载new和delete
可以在任何类说明之外重在new和delete,使它们成为全局的。当new和delete被重载为全局时,C++原来的new与delete被忽略,并且重载的运算符用于所有类型(包括标准型和用户定义类型)的分配要求。
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class three_d
{
private:
int x,y,z;
public:
three_d(int a,int b,int c);
~three_d()
{
cout << "Destructing\n";
}
friend ostream & operator <<(ostream &stream,three_d obj);
};
three_d::three_d(int a,int b,int c)
{
cout << "Constructing\n";
x = a;
y = b;
z = c;
}
void *operator new(size_t size)
{
cout << "in threee_d new\n";
return malloc(size);
}
void operator delete(void *p)
{
cout << "in three_d delete\n" ;
free(p);
}
ostream &operator <<(ostream &os,three_d obj)
{
os << obj.x << ",";
os << obj.y << ",";
os << obj.z << "\n";
return os;
}
int main(int argc,char *argv[])
{
three_d *p = new three_d(1,2,3);
three_d *p1 = new three_d(4,5,6);
if(!p || !p1)
{
cout << "Allocation failure" << endl;
return 1;
}
cout << *p << *p1;
delete p;
delete p1;
int *pnum;
pnum = new int;
*pnum = 0;
cout << "num = " << *pnum << endl;
delete pnum;
cout << "Application Run Successfully!" << endl;
return 0;
}
C++ new和delete重载的更多相关文章
- [百度空间] [原] 全局operator delete重载到DLL
由于很久没有搞内存管理了,很多细节都忘记了今天项目要用到operator delete重载到DLL,发现了问题,网上搜索以后,再对比以前写的代码,发现了问题:原来MSVC默认的operator new ...
- new和delete重载
1. 简介 new/delete关键字,其本质是预定义的操作符,因此支持重载 默认new和delete的行为: new: ①获取内存空间(默认为堆空间):②在获取的空间中调用构造函数创建对象 d ...
- [GeekBand] C++ 内存分布—— new和delete重载的实现及分析
本文参考文献:GeekBand课堂内容,授课老师:侯捷 :深度探索C++对象模型(侯捷译) :网络资料: http://www.leavesite.com/geekband-cpp-5.html ht ...
- new/delete重载
在c++中,有时我们需要在运行阶段为一个变量分配未命名的内存,并使用指针来访问它,这里就可以用到new关键字.另外需要指出的是,new分配的内存块通常与常规变量分配的内存块不同,常规变量的值都储存在被 ...
- 走进C++程序世界-----operator new delete 重载
在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...
- 重载new和delete
当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...
- 重载全局new/delete实现内存检测
下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator ...
- 重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
- 运算符重载之new与delete
关于new/delete,援引C++ Primer中的一段话: 某些应用程序对内存分配有特殊的要求,因此我们无法直接将标准的内存管理机制直接应用于这些程序.他们常常需要自定义内存分配的细节,比如使用关 ...
随机推荐
- BG.Hive - part3
1. Hive数据导入 - Load Load,加载,不会进行任何数据转换和处理的操作,只会进行数据Move操作,将元数据移动到HDFS指定目录 a> hdfs dfs -put 'hdfs的h ...
- Node.js构建可扩展的Web应用1
<Practical Node.js:Building Real-World Scalable Web Apps>[美]Azat Mardan(电子工业出版社) 安装node.js和NPM ...
- 【原】Spring activiti 环境搭建之数据库创建
由于在开发工作流的时候,避免不了要保存一些数据和流程走向;所以在搭建Spring activiti开发环境的时候需要把官方提供的23张表创建到我们的DB,后续的流程都会在这些表中记录. 1.创建代码如 ...
- HDU 1016 S-Nim ----SG求值
S-Nim Time Limit : 5000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- JAVA非静态成员变量之死循环
1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...
- ZAB 算法
ZAB (Zookeeper Atomic Broadcast ) zookeeper原子消息广播协议 保证:分布式数据一致性 所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为 ...
- 基于 vue+element ui 的cdn网站(多页面,都是各种demo)
前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...
- Linux学习5-初学者注意事项
1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 硬盘文件是/dev/sd[a-p] 光盘文件是/dev/sr0等 3.Linux不靠扩展名区分文件类型, ...
- 小程序:获取input输入的值
wxml <input placeholder='输入你的姓名' value='{{name}}' bindblur='nameblur'></input> js data ...
- 一文理解JS的节流、防抖及使用场景
函数防抖(debounce):在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 看一个