c++中new的知识点
在练习内存池时,发现需要重载new,可是这个重载只是重载了operator new,那么还有哪几种new呢,下面来记录一下
首先记录一个点,在类中重载operator new,默认就是静态成员函数,所以不能生命为虚函数,不能调用非静态成员变量
下面正文,c++有三种new
说的通俗点。1、new运算符(new operator)大哥,我们在代码中直接使用的就是它。它做2件事:调用后两种new申请内存和初始化对象。2、operator new,是一个函数,所以也是三种new唯一一个可以重载的。它类似C语言中的malloc,用于分配内存。3、placement new,用于初始化对象(如果有的话,就是它调用构造函数)
1.operator new
operator new和operator delete有两个重载版本,每个版本支持相关的new表达式和delete表达式:
void *operator new(size_t); void *operator new[](size_t); void *operator delete(void*); void *operator delete[](void*);
入参类型必须为size_t,返回类型必须为void *.可以重载为多个参数版本如下
void *operator new(size_t t1,size_t t2);
这样如果调用未 void *p= new(10) int;时 t2的大小就为10.而t1的大小一直是固定的(可能根据系统不同而变化)
这个是我们唯一可以重载的new,不仅可以在类内重载,全局operator new也可以被重载。如果全局operator new被重载的话,那么除了类内的重载会覆盖全局的重载,任何地方调用new 都会调用到这个全局重载的函数里 2.new operator
当你写string *ps = new string(“Hands up!”)时,你所使用的new是所谓的new operator,它其实干了两件事:
一、分配足够的内存(实际大小是大于所创建的对象大小,因为有管理的数据),即operator new。
二、调用对象构造函数,new operator永远干这两件事。上面的那段代码大约反映以下的行为
void *mem = operator new(sizeof(string));
call string::string(“Hands up!”) on *mem;//只能由编译器完成,用户是不允许这样操作的,也就是说如果你想建立一个堆对象就必须用new操作符,不能直接像上面一样调用构造函数来初始化堆对象。 也就是说operator new仅仅分配内存(就像malloc一样),我们能够做的仅仅是重载operator new,为自己的类创建一个定制的内存管理方案,
这也让我有点明白为什么在重载operator new的时候并没有写调用构造函数的代码,但它确实被调用了,原来都是new operator搞的鬼。
编译器看到类类型的new或者delete表达式的时候,首先查看该类是否是有operator new或者operator delete成员,如果类定义了自己的new和delete函数,则使用这些函数为对象分配和释放内存,否则调用标准库版本。如果你想定制自己独有的内存分配过程,你应该重载全局的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new。当然你可以显示的调用:: operator new和:: operator delete强制使用全局的库函数
3.定位new表达式
即placement new,定位new表达式在已分配的与原始内存中初始化一个对象,他与new的其他版本不同,它不分配内存。相反,它接受指向已分配好但未构造的内存指针,并在该内存中初始化一个对象。实际上,定位new表达式使我们在特定的、预分配的内存地址构造一个对象。它可以定义类的任何构造函数。
new(place_address) type
new(place_address) type(initializer_list)
举个例子,
我们也可以直接来使用它,你手上有一块内存p。int *p2 = new (p) int(100); 这样你就用placement new把一块内存初始化为int,并给它个初值100。其实这里,p所指向的内存可以是堆也可以是栈。如果是栈内存被这样new,不需要delete,且可以反复的new。这有什么用, 你可以把动态分配内存的请求限制在一块区域内,这就有点像操作系统给引用程序分配内存,这一块给你随便用, 妨碍不到其他的内存。算是一种安全策略吧。
c++中new的知识点的更多相关文章
- PHP面向对象中的重要知识点(三)
1. namespace: 和C++中的名字空间很像,作用也一样,都是为了避免在引用较多第三方库时而带来的名字冲突问题.通过名字空间,即便两个class的名称相同,但是因为位于不同的名字空间内,他们仍 ...
- PHP面向对象中的重要知识点(二)
1. __toString: 当对象被打印时,如果该类定义了该方法,则打印该方法的返回值,否则将按照PHP的缺省行为输出打印结果.该方法类似于Java中的toString(). <?php cl ...
- PHP面向对象中的重要知识点(一)
1. __construct: 内置构造函数,在对象被创建时自动调用.见如下代码: <?php class ConstructTest { private $arg1; private $arg ...
- JS中常用开发知识点
JS中常用开发知识点 1.获取指定范围内的随机数 2.随机获取数组中的元素 3.生成从0到指定值的数字数组 等同于: 4.打乱数字数组的顺序 5.对象转换为数组 //注意对象必须是以下格式的才可以通 ...
- bootstrap实战练习中涉及的知识点(很有用哦!)
看的有关视频做的笔记,对bootstrap中涉及的知识点做了一定的解析,很有用哦!(新手上路,有不合适的地方可以指出哦!) 下面进入正题: Bootstrap是当下最流行的前端框架(界面工具集) 特点 ...
- 私人定制javascript中对象小知识点(Only For Me)
废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说 ...
- ORACLE中死锁的知识点总结
死锁的概念 什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包装后,一个抢了枪, 一个逮住了子 ...
- HTML中重要的知识点,表单
今天跟大家分享一下有关HTML中比较重要的一个知识点-表单: <form></form>表单 这是一个双标签,form表单有两个必须要有的属性,①action就是指表单传递到的 ...
- python中的小知识点
这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...
- 总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
随机推荐
- [译]如何使用Python构建指数平滑模型:Simple Exponential Smoothing, Holt, and Holt-Winters
原文连接:How to Build Exponential Smoothing Models Using Python: Simple Exponential Smoothing, Holt, and ...
- echarts中国地图描绘
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="utf-8&qu ...
- 日常工作问题解决:记一次centos7上的lvm表错误解决过程
问题描述: 公司大数据hadoop2服务器采用电信云服务器,后来故障,电信恢复该服务器,需要重新部署程序,需要扩展lvm分区,但是使用pvsan命令发现有报错信息,需要解决以防重启后,因挂载问题,无法 ...
- bootstrap-table删除指定行注意事项
方法有两种: 1.使用官方文档的数据(反正我试了2个小时都不行,如有大神请指导下):使用events和operate相结合的方式 2.不使用events,在formatter里面定义事件的实现. 上面 ...
- [转帖]Google Chrome 解决 “您的连接不是私密连接”
Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持 自己搭建了 k8s的 dashboard 结果 chrome 最新版本的打不开了.. 百度了下 园友的解决方案很完美 这里面转 ...
- 使用window.open 实现弹框和居中对齐
// 打开页面方法 window.open(url, '_blank', centerStyle('600', '400')+',toolbar=no,menubar=no,resizeable=no ...
- INI配置文件格式解析
INI配置文件有三要素parameters,sections和comments. 1.parameters 指一条配置,就像key = value这样的. 2.sections sections是pa ...
- 第1章:Python语言与Linux系统管理
1.Python语言为什么流行 1).简单易学 2).丰富强大的库 3).开发效率高 2.Python语言有什么缺点 1).Python的执行速度不够快 2).Python的GIL锁限制并发:GIL是 ...
- mvc 登陆界面+后台代码
上代码 前端+js(懒得分文件了) @{ ViewBag.Title = "MVC权限系统架构学习-登录"; Layout = "/Views/Shared/_LoadJ ...
- 买条Vineyard Vines裙子为啥子那么难?因为能遮胖?因为英国王子穿过?
为了这件vineyard vines, 我周六冒雨,去斯坦福shopping center说卖完了,我冒雨赶回家,上网买到了,今天早上发email说没货了,自动取消我的订单.我下午又打了40分钟电话给 ...