了解各种不同意义上的new
问题1:请说明new operator 和 operator new的差异?
1、new operator :
一般我们写代码的时候,例如:String *p = new String("Memory Management"); 所谓的new就是new operator。其动作一般分为两步:step1、开辟空间(分配足够的内存,用来放置某类型的对象;step2、调用构造函数,为刚才分配的内存中的那个对象设定初值)-----------------------------------new operator总是做这两件事,无论如何改变不了。
2、operator new :
new operator调用“某个函数”执行必要的内存分配,“某个函数”的名称叫做:operator new。
(1)我们可以重写或者重载这个函数来改变它的行为,但,特别注意:函数operator new的通常声明如下:void* operator new(size_t size);{返回类型必须是void* ; 参数类型必须是 size_t }
(2)可以像其他函数一样直接调用:void *rawMemory = operator new(sizeof(string)); {这里的operator new将返回指针,指向一块足够容纳一个string对象的内存}
3、Placement new
如果我们需要在已经分配好的原始内存里构建对象,则需要一个特殊版本的operator new,我们称它为placement new。
伪代码做个示范:
class Widget
{
public:
Widet(int widgetSize);
...
};
Widet *constructWidetInBuffer(void *buff,int widetSize)
{
return new (buffer) Widet(widetSize);
}
此函数是返回一个指针,指向一个widet的类结构,它被构造于传递给此函数的一块内存缓冲区上。
在constructWidetInBuffer 函数内部,唯一一个表达式:
new (buffer) Widet(widetSize);
这是new operator的用法之一,其中(buffer)作为new operator“隐式调用 operator new”时所用。于是这时候,被调用的operator new除了接受“size_t参数”之外,还接受了“void *参数”,指向一块内存,准备用来接收构造好的对象。
看起来就像:
void * operator new(size_t,void *location)
{
return location;
}
仔细想想:
operator new的目的就是为了找到一块内存,然后返回一个指针指向它。在Placement new的情况下,调用者已经知道指向内存的指针了,因此Placement new唯一需要做的就是将它获得的指针再返回。
哦对,用placement new必须加头文件#include<new>或#include<new.h>。
总结:
只打算分配内存:operator new
打算在堆区产生时自己决定内存分配方式,那么自己写一个operator new,然后使用 new operator,它将会自动调用你所写的operator new。
如果你打算在已分配(并拥有指针)的内存中构造对象:placement new。
让我们看看到底调谁的 operator new

delete与之相对应!!!
了解各种不同意义上的new的更多相关文章
- C# webbrowser实现真正意义上的F5刷新
关于webbrowser的刷新在C#中有提供方便的方法: webbrowser.refresh(); 但是有时候会发现,不给力啊 那怎么办? 还有一招: webBrowser1.Document.Ex ...
- 真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合
真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合 博客分类: java 测试 单元测试SpringCC++C# 一.要解决的问题: spring环境中 ...
- 初次真正意义上的接触Eclipse
以前就玩安卓app 用过很多软件比如e4a,iapp,aide,lua,但是这都不是真正意义上的安卓编程软件.大二的时候用过Androidstudio,那个软件配置起来太难了,就搁置了. 这次利用机智 ...
- ISO C++标准委员会不是一个一般意义上权力机构,基本上愿意交会费,愿意自己出时间,出酒店机票,出提案,就可以申请加入。
ISO C++标准委员会不是一个一般意义上权力机构,基本上愿意交会费,愿意自己出时间,出酒店机票,出提案,每年全世界参加会议被专家巨细靡遗地评头论足,就可以申请加入. 所以参加标准委员会背景各异,有人 ...
- flask如何返回真正意义上的json字符串?以及中文如何正常显示?
flask中,不能直接return字典,需要把字典转换为json字符串方式有三种:1. return str(字典)2.return json.dumps(字典)3.return jsonify(字典 ...
- 《Python高手之路 第3版》这不是一本常规意义上Python的入门书!!
<Python高手之路 第3版>|免费下载地址 作者简介 · · · · · · Julien Danjou 具有12年从业经验的自由软件黑客.拥有多个开源社区的不同身份:Debian开 ...
- 实现真正意义上的前后端分离------由淘宝引入nodejs引发的思考
说起前后端分离,大家包括我自己都会想到: 当今流行的MVC不就是最标准的前后端分离吗? 说到这里,我不禁要反问,MVC真正的实现了前后端分离了吗? 无论是PHP的MVC框架TP还是JAVA的MVC框架 ...
- Android状态栏微技巧,带你真正意义上的沉浸式
记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...
- Android真正意义上的无限轮播Banner
在android开发的时候,经常会使用到轮播图,对于这种效果,一般情况下,我们都会使用一种叫做ViewPager的来实现. 传统的实现逻辑是自定义一个View继承ViewPager,在适配器中 将co ...
- Android Fragment真正意义上的onResume和onPause
Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效 ...
随机推荐
- jquery移除元素时会自动解绑事件
.html() When .html() is used to set an element's content, any content that was in that element is co ...
- I think I need a boat house
I think I need a boat house. Fred Mapper is considering purchasing some land in Louisiana to build h ...
- 学习笔记TF042:TF.Learn、分布式Estimator、深度学习Estimator
TF.Learn,TensorFlow重要模块,各种类型深度学习及流行机器学习算法.TensorFlow官方Scikit Flow项目迁移,谷歌员工Illia Polosukhin.唐源发起.Scik ...
- PythonStudy——函数的分类 Classification of functions
# PEP8:python写代码的规范 def fn(n1, n2): """ 函数的文档注释 :param n1: 第一个数 :param n2: 第二个数 :retu ...
- 菜鸟Vue学习笔记(二)
上一篇文章跟大家分享了Vue笔记上半部分,这篇文章接着跟大家分享.最近学习Vue越来越顺利了,今天接着学习,接着记录. 首先,来学习下常用的v-bind属性,它的作用是在属性中使用vue中定义的变量的 ...
- Session、Cookie、Cache、Token分别是什么及区别
一.Session 1 )Session 解释 Session 是单用户的会话状态.当用户访问网站时,产生一个 sessionid.并存在于 cookies中.每次向服务器请求时,发送这个 cooki ...
- python找递归目录中文件,并移动到一个单独文件夹中,同时记录原始文件路径信息
运营那边有个需求. 下载了一批视频文件,由于当时下载的时候陆陆续续创建了很多文件夹,并且,每个文件夹下面还有子文件夹以及视频文件,子文件夹下面有视频文件或者文件夹 现在因为需要转码,转码软件只能对单个 ...
- Java面向对象 第5节 抽象类和接口
一.抽象类和抽象方法 区分抽象方法和普通方法1)当一个方法被abstract修饰时,该方法成为抽象方法2)抽象类所在的类必须定义为抽象类3)抽象方法不会有具体的实现,而是在抽象类的子类中通过方法重写进 ...
- redis 4.x 安装哨兵模式 sentinel
1.下载 http://download.redis.io/releases/redis-4.0.11.tar.gz 2.解压 tar zxvf redis-4.0.11.tar.gz 3.安装 cd ...
- CIFAR10数据可视化
一.数据准备 下载cifar-10-binary.tar.gz并解压,其中有多个bin文件,现对data_batch_1.bin进行可视化. 二.数据说明 该二进制文件存储的有10000张32X32的 ...