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中的一段话: 某些应用程序对内存分配有特殊的要求,因此我们无法直接将标准的内存管理机制直接应用于这些程序.他们常常需要自定义内存分配的细节,比如使用关 ...
随机推荐
- Redis高可用升级
前言: 缓存对应实时性要求比较高的业务需求可谓十分重要,但缓存中的实时数据一旦丢失,将直接影响整个业务功能.考虑到各场景的业务需求,redis推出了高可用的方案,即:主从+哨兵的HA机制. 准备 &q ...
- 15.Generator 函数的语法
Generator 函数的语法 Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generat ...
- Firebird 备份与恢复
备份test gbak -b test d:\test.bak -user sysdba 恢复为test1 gbak -c d:\test.bak test1
- Red Hat Linux 无法使用yum命令
一:首先提供部分Red Hat 镜像下载地址 1.rhel-server-6.8-i386-dvd.iso 链接: https://pan.baidu.com/s/18VqxRgBMuAJE7Ty0H ...
- ADO调用分页查询存储过程
一.分页存储过程 ----------使用存储过程编写一个分页查询----------------------- set nocount off --关闭SqlServer消息 --set nocou ...
- Vertica示例数据库安装
1.示例数据库简介: Vertica跟传统数据库一样,自带了示例数据库--VMart示例数据库,是一个多架构数据库.该数据是大型超市(VMart)中可能会用到的数据库,可用来访问产品.客户.员工以及网 ...
- JavaScript shift()函数移出数组第一个数据
pop() 函数用来移出数组中最后一个元素.如果想要移出第一个元素要怎么办呢? .shift() 就是专门用来处理这类型需求的.它的工作原理类似 .pop(),但它移除的是第一个元素,而不是最后一个.
- C# 分页方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; ...
- 第二十四天- 模块导入 import from xxx import xxx
# 模块:# 模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块的名字加上.py后缀# 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀个模块# 为何用模块:写大项目时,把相关的功能进⾏分 ...
- MySQL创建数据库/表等基本命令操作
前提:安装好MySQL并且配置好服务,能够正常使用 按住键盘上的Windows图标,通过搜索框找到MySQL5.7 Command Line Client,点击启动 输入安装时设置用户的密码 成功连接 ...