问题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的更多相关文章

  1. C# webbrowser实现真正意义上的F5刷新

    关于webbrowser的刷新在C#中有提供方便的方法: webbrowser.refresh(); 但是有时候会发现,不给力啊 那怎么办? 还有一招: webBrowser1.Document.Ex ...

  2. 真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合

    真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合 博客分类: java 测试 单元测试SpringCC++C#  一.要解决的问题:     spring环境中 ...

  3. 初次真正意义上的接触Eclipse

    以前就玩安卓app 用过很多软件比如e4a,iapp,aide,lua,但是这都不是真正意义上的安卓编程软件.大二的时候用过Androidstudio,那个软件配置起来太难了,就搁置了. 这次利用机智 ...

  4. ISO C++标准委员会不是一个一般意义上权力机构,基本上愿意交会费,愿意自己出时间,出酒店机票,出提案,就可以申请加入。

    ISO C++标准委员会不是一个一般意义上权力机构,基本上愿意交会费,愿意自己出时间,出酒店机票,出提案,每年全世界参加会议被专家巨细靡遗地评头论足,就可以申请加入. 所以参加标准委员会背景各异,有人 ...

  5. flask如何返回真正意义上的json字符串?以及中文如何正常显示?

    flask中,不能直接return字典,需要把字典转换为json字符串方式有三种:1. return str(字典)2.return json.dumps(字典)3.return jsonify(字典 ...

  6. 《Python高手之路 第3版》这不是一本常规意义上Python的入门书!!

    <Python高手之路 第3版>|免费下载地址 作者简介  · · · · · · Julien Danjou 具有12年从业经验的自由软件黑客.拥有多个开源社区的不同身份:Debian开 ...

  7. 实现真正意义上的前后端分离------由淘宝引入nodejs引发的思考

    说起前后端分离,大家包括我自己都会想到: 当今流行的MVC不就是最标准的前后端分离吗? 说到这里,我不禁要反问,MVC真正的实现了前后端分离了吗? 无论是PHP的MVC框架TP还是JAVA的MVC框架 ...

  8. Android状态栏微技巧,带你真正意义上的沉浸式

    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...

  9. Android真正意义上的无限轮播Banner

    在android开发的时候,经常会使用到轮播图,对于这种效果,一般情况下,我们都会使用一种叫做ViewPager的来实现. 传统的实现逻辑是自定义一个View继承ViewPager,在适配器中 将co ...

  10. Android Fragment真正意义上的onResume和onPause

    Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效 ...

随机推荐

  1. 类Shiro权限校验框架的设计和实现

    前言: 之前简单集成了springmvc和shiro用于后台管理平台的权限控制, 设计思路非常的优美, 而且编程确实非常的方便和简洁. 唯一的不足, 我觉得配置稍有些繁琐. 当时我有个小想法, 觉得可 ...

  2. Linux系统下用find命令查找最近修改过的文件

    1.先进入指定目录,比如:cd /var/ftp/ss 2.输入指定命令,相关命令如下介绍: 最近24小时内修改过的文件 find ./ -mtime 0 前48~24小时修改过的文件 find ./ ...

  3. SQL-记录-005

    对于记录的操作涉及的知识比较多,分多篇文章进行梳理. 记录创建篇:记录删除篇:记录修改篇:记录查询篇:

  4. django jquery ajax 知识点

    示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <div id='d'>1</div> <div> <div id='i1' nam ...

  5. 再见了我热爱的ACM赛场

    随着2017EC-Final结束,我的ACM生涯也真正结束了,区域赛三铜三银三金,没有打铁,对我来说算是很满足了. 为什么打了ACM?我记得进入大学之后大概认真上课两三周,我就开始对大学讲课失望,开始 ...

  6. python中表示False的一些内置对象

    By default, an object is considered true unless its class defines either a __bool__() method that re ...

  7. Dynamics CRM Publisher

    如果你想创建并且部署一个solution(解决方案),你需要创建一个publisher. 当准备创建一个solution并且创建entity field, relationship在这个solutio ...

  8. Window离线环境下如何安装pyhanlp

    Hanlp在离线环境下的安装我是没有尝试过的,分享SunJW_2017的这篇文章就是关于如何在离线环境下安装hanlp的.我们可以一起来学习一下! HanLP是一款优秀的中文自然语言处理工具,可以实现 ...

  9. 1、minimum-depth-of-binary-tree

    题目描述 Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the ...

  10. (转)SQLServer查询数据库各种历史记录

    原文地址https://www.cnblogs.com/seusoftware/p/4826958.html 在SQL Server数据库中,从登陆开始,然后做了什么操作,以及数据库里发生了什么,大多 ...