2019独角兽企业重金招聘Python工程师标准>>>

acement new是operator new的一个重载版本,只是我们很少用到它。如果你想在已经分配的内存中创建一个对象,使用new是不行的。也就是说placement new允许你在一个已经分配好的内存中(栈或堆中)构造一个新的对象。原型中void*p实际上就是指向一个已经分配好的内存缓冲区的的首地址。

我们知道使用new操作符分配内存需要在堆中查找足够大的剩余空间,这个操作速度是很慢的,而且有可能出现无法分配内存的异常(空间不够)。placement new就可以解决这个问题。我们构造对象都是在一个预先准备好了的内存缓冲区中进行,不需要查找内存,内存分配的时间是常数;而且不会出现在程序运行中途出现内存不足的异常。所以,placement new非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序。

使用方法如下:

1. 缓冲区提前分配

可以使用堆的空间,也可以使用栈的空间,所以分配方式有如下两种:

class MyClass {…};

char *buf=new char[N*sizeof(MyClass)+ sizeof(int) ] ; 或者char buf[N*sizeof(MyClass)+ sizeof(int) ];

2. 对象的构造

MyClass * pClass=new(buf) MyClass;

3. 对象的销毁

一旦这个对象使用完毕,你必须显式的调用类的析构函数进行销毁对象。但此时内存空间不会被释放,以便其他的对象的构造。

pClass->~MyClass();

4. 内存的释放

如果缓冲区在堆中,那么调用delete[] buf;进行内存的释放;如果在栈中,那么在其作用域内有效,跳出作用域,内存自动释放。

注意:

1)        在C++标准中,对于placement operator new []有如下的说明: placement operator new[] needs implementation-defined amount of additional storage to save a size of array. 所以我们必须申请比原始对象大小多出sizeof(int)个字节来存放对象的个数,或者说数组的大小。

2)        使用方法第二步中的new才是placement new,其实是没有申请内存的,只是调用了构造函数,返回一个指向已经分配好的内存的一个指针,所以对象销毁的时候不需要调用delete释放空间,但必须调用析构函数销毁对象。

-----------------------------------------------

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/416440

placement new操作符相关推荐

  1. placement new 操作符

    placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...

  2. C++中placement new操作符(经典)

    placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...

  3. C++中的布局new操作符

    C++中的布局new操作符 通常,new负责在堆内存中找到一个能够满足要求的内存块.new操作符还有一种变体:placement new 操作符,它能让你指定要使用的内存的位置. 程序员可以使用这种特 ...

  4. C++中nothrow的介绍及使用

    在C中,使用malloc等分配内存的函数时,一定要检查其返回值是否为"空指针",并以此作为检查内存操作是否成功的依据,这种Test-for-NULL代码形式是一种良好的编程习惯,也 ...

  5. 一个跨平台的 C++ 内存泄漏检测器

    From:http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html 内存泄漏对于C/C++程序员来说也可以算作是个永恒的话题了吧.在 ...

  6. 深入理解C++11 读书笔记(三) 通用与专用

    继承构造函数 如果派生类并不需要改变构造函数,那么可以用新的using Base::Base直接继承基类的构造函数,基类构造函数很多的时候,这样做非常方便.如果派生类还有自己的成员需要初始化,可以利用 ...

  7. __mt_alloc源码分析(1)

    本文从源代码级别研究mt allocator的内部实现,使用GCC 4.1.2版本的源码,主要源文件为库文件<ext/mt_allocator.h>和GCC源码中的"libstd ...

  8. C++ 中 new 操作符内幕:new operator、operator new、placement new

    一.new 操作符(new operator) 人们有时好像喜欢有意使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...

  9. Placement new

    new 操作一般可以分为两个过程:1为申请内存空间 2为调用类型的构造函数进行构造 placement new 调用类型的构造函数对已存在的内存进行构造 1 #include<new.h> ...

最新文章

  1. Adobe Premiere Pro CC 2018下载安装方法讲解
  2. python中的property
  3. 数字的补数——力扣476
  4. mysql手工注入imformation_mysql 简单手工注入
  5. eclipse14配置tomcat Server Locations
  6. 物联网部署的5个阶段
  7. 关于sqlite断电或者存储空间不足造成的数据文件损坏问题-转
  8. 希尔排序java代码_希尔排序及希尔排序java代码
  9. getvalue参数计数不匹配_数据人:不懂业务,分析就仅仅只是提数
  10. hive split 注意事项
  11. 完成端口(CompletionPort)之客户端篇
  12. 计算机三级网络技术上机,计算机三级网络技术上机部分(南开100题题库)
  13. 构建KEGG pathway、Entrez ID、Ensemble ID的对应关系
  14. python三维图形等高线_python等高线
  15. 主板开启网络唤醒_电脑网络唤醒如何关闭?华硕路由网络唤醒?#TIL#网络唤醒(WOL)除了设置主板,还需要操作系...
  16. java反射类型转换_Java反射探索研究(转)
  17. 教育元宇宙何时常态化应用?专家建议纳入教育数字化战略行动
  18. input,checkbox启用禁用
  19. docker-swam集群搭建
  20. 涉密计算机系统分级保护,计算机信息系统分级保护方案.pdf

热门文章

  1. android EditText使用详解,29.Android EditText使用详解
  2. remix卡在android root,小米平板刷入remixeOS后怎么root?
  3. 易优CMS精美简洁作文范文网站模板源码
  4. 小程序 微信红包封面后台独立版 带测评积分功能源码
  5. 知识付费阅读小程序源码,前端+后台+代理+分销
  6. 百度小程序全套源码下载、免费分享,一键生成百度小程序
  7. 程式CSCMSV4黑色炫酷DJ音乐门户模板 音乐网源码
  8. SpringBoot FK-关联表查询(三)
  9. SpringBoot FK-关联表查询(二)
  10. CodeSmith实用技巧(九):重载Render方法来控制输出