当前位置: 首页 > article >正文

重载new和delete

起源

如果我们的程序需要频繁的new和delete,就会导致内存碎片、性能损失等问题,所以需重载new 和delete,如果我们不用new和delete,直接把数据放在栈里面,是不是就能避免这个问题呢,但栈的空间是有限的,大型程序都是把数据放在了堆里面

原理

new的工作原理

1.通过new分配内存

2.调用构造函数

3.返回内存的指针

delete工作原理

1.调用析构函数

2.通过delete释放内存

在这5个步骤里面,我们能够重载的只有new的1和delete的2,其他的都是系统已经写好的

new和delete的其他形式

char* mem=new char[0x10001];

char* x=new(mem) char[10];

new的另一种形式就是指定它所创建的地址,这里x和mem指向同一块内存,就是把第二行的new开辟的内存,然后让mem指向它,即0x10001有了10个char类型的内存空间,然后让x来接收

同样,delete也可以写成这种形式

重载

可以重载为成员函数和全局,但是全局太复杂,而且很容易出错,这里不写

void* hint::operator new(size_t size)
{
	return ::operator new(size);
}

为什么返回值是void*呢,因为new一个对象后,都会返回一个指针,函数里面的::operator new 是什么意思呢?这是调用了系统本身的operator new,::表示全局,我们使用一下new

hint* gold1 = new hint;

在这里,我们并没有传入参数size,它是自动把new的对象大小传入进来

void hint::operator delete(void* ptr)
{
	std::cout << ptr << "已销毁" << std::endl;
	::operator delete(ptr);
}

 注意

我们重载new和delete就要把它们的所有(6种)形式全部重载一遍,因为我们重载就是为了更好的管理内存,所以每种new的形式都要重载,如果我们不想重载这么多,可以强制性的用   

函数=delete删除掉不用的形式

知识扩展*:重载后的new和delete默认为static函数,这是因为重载new时,还未调用构造函数,没有对象,也就没有this指针,static是没有this指针的,而delete重载是在调用析构之后,很多内存都被释放了


http://www.kler.cn/news/16264.html

相关文章:

  • Flutter集成个推推送-安卓原生篇
  • 【电商必学】 WhatsApp 全新攻略:什么是交互式消息模板
  • 【Zookeeper源码走读】第一章 客户端与服务器的连接过程
  • 麓言信息设计创意思维,打开设计师思路
  • 智慧物流信息系统开发需具备哪些功能?
  • 2023北京老博会(中国国际老年产业博览会)展位预订迎高峰
  • 鸿蒙系统是什么?鸿蒙与开源鸿蒙的关系?鸿蒙系统的发展历程
  • H2O生成——屏障
  • 论文笔记:Model-Contrastive Federated Learning
  • TPM-TPM-Profile-PTP协议-2
  • Vue3事件绑定
  • 【五一创作】50道Java面试题
  • Python的一些知识
  • 做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !
  • 更轻更好用的蓝牙耳机,日常佩戴更舒适,QCY Crossky Link体验
  • Nginx:常见的面试题和答案
  • Delphi 内存分配
  • Java程序猿搬砖笔记(十二)
  • 记录和传播知识的重要性不亚于创造知识本身【专利所保护的,主要是`流程`、`工艺`和`方法`,不是一个具体的产品。】
  • 与贵州公安面对面|欧科云链天眼中国行,他们都说“行”
  • 点亮第一个LED灯
  • vue3+element-plus角色权限管理分配
  • 使用cube studio开发机器学习建模的pipeline
  • Java面试题字节流字符流
  • python-使用Qchart总结3-绘制曲线图
  • 马斯克们叫停 GPT-5,更像是场行为艺术
  • 【SpringBoot 应用打包与部署】
  • 为什么越来越多的企业选择云计算
  • 《Netty》从零开始学netty源码(四十六)之PooledByteBuf
  • 不能使用chatGPT?这3个平替甚至比chatGPT更强