问题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与之相对应!!!

最新文章

  1. cookie (储存在用户本地终端上的数据)
  2. 如何用photoshop把图片白色背景变成透明?
  3. No.015:3Sum
  4. js 默认选中分页条件项
  5. 桥接模式(Bridge)
  6. 同网段下,windows自带远程桌面连接
  7. BZOJ2626: JZPFAR
  8. PD 脚本中列名注释用Name属性
  9. AQL Subset Compiler:手把手教你如何写一个完整的编译器
  10. Jquery DataTables 使用AJAX POST的问题
  11. JAVAscript学习笔记 js计时器与倒计时 第六节 (原创) 参考js使用表
  12. Git 下载代码简单说明
  13. Codeforces 939E Maximize! (三分 || 尺取)
  14. SVN拉分支,合并分支
  15. MacDev.GarbageCollectionIsDeprecated-WhenXcodeCompileMacAppProject
  16. ElasticSearch 2 (19) - 语言处理系列之故事开始
  17. JAVA记录-JSP指令
  18. C++--------------------------------指针和数组替换使用原因
  19. [leetcode]Word Ladder II @ Python
  20. Android自动化压力测试图解教程——Monkey工具 (转)

热门文章

  1. groovy学习知识
  2. ubuntu安装驱动问题
  3. 【转】利用Boost.Python将C++代码封装为Python模块
  4. 5G投资逻辑
  5. jenkins中如何实现执行脚本时的变量共享
  6. C#程序终止问题CLR20R3解决方法
  7. Linux操作redis 使用(VMwareWorkstation)
  8. WM消息对应的Message消息中的Lparam和WParam
  9. Swift 通过运行时获取属性名列表
  10. Python第1天