placement new操作符
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操作符相关推荐
- placement new 操作符
placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...
- C++中placement new操作符(经典)
placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...
- C++中的布局new操作符
C++中的布局new操作符 通常,new负责在堆内存中找到一个能够满足要求的内存块.new操作符还有一种变体:placement new 操作符,它能让你指定要使用的内存的位置. 程序员可以使用这种特 ...
- C++中nothrow的介绍及使用
在C中,使用malloc等分配内存的函数时,一定要检查其返回值是否为"空指针",并以此作为检查内存操作是否成功的依据,这种Test-for-NULL代码形式是一种良好的编程习惯,也 ...
- 一个跨平台的 C++ 内存泄漏检测器
From:http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html 内存泄漏对于C/C++程序员来说也可以算作是个永恒的话题了吧.在 ...
- 深入理解C++11 读书笔记(三) 通用与专用
继承构造函数 如果派生类并不需要改变构造函数,那么可以用新的using Base::Base直接继承基类的构造函数,基类构造函数很多的时候,这样做非常方便.如果派生类还有自己的成员需要初始化,可以利用 ...
- __mt_alloc源码分析(1)
本文从源代码级别研究mt allocator的内部实现,使用GCC 4.1.2版本的源码,主要源文件为库文件<ext/mt_allocator.h>和GCC源码中的"libstd ...
- C++ 中 new 操作符内幕:new operator、operator new、placement new
一.new 操作符(new operator) 人们有时好像喜欢有意使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...
- Placement new
new 操作一般可以分为两个过程:1为申请内存空间 2为调用类型的构造函数进行构造 placement new 调用类型的构造函数对已存在的内存进行构造 1 #include<new.h> ...
最新文章
- Adobe Premiere Pro CC 2018下载安装方法讲解
- python中的property
- 数字的补数——力扣476
- mysql手工注入imformation_mysql 简单手工注入
- eclipse14配置tomcat Server Locations
- 物联网部署的5个阶段
- 关于sqlite断电或者存储空间不足造成的数据文件损坏问题-转
- 希尔排序java代码_希尔排序及希尔排序java代码
- getvalue参数计数不匹配_数据人:不懂业务,分析就仅仅只是提数
- hive split 注意事项
- 完成端口(CompletionPort)之客户端篇
- 计算机三级网络技术上机,计算机三级网络技术上机部分(南开100题题库)
- 构建KEGG pathway、Entrez ID、Ensemble ID的对应关系
- python三维图形等高线_python等高线
- 主板开启网络唤醒_电脑网络唤醒如何关闭?华硕路由网络唤醒?#TIL#网络唤醒(WOL)除了设置主板,还需要操作系...
- java反射类型转换_Java反射探索研究(转)
- 教育元宇宙何时常态化应用?专家建议纳入教育数字化战略行动
- input,checkbox启用禁用
- docker-swam集群搭建
- 涉密计算机系统分级保护,计算机信息系统分级保护方案.pdf
热门文章
- android EditText使用详解,29.Android EditText使用详解
- remix卡在android root,小米平板刷入remixeOS后怎么root?
- 易优CMS精美简洁作文范文网站模板源码
- 小程序 微信红包封面后台独立版 带测评积分功能源码
- 知识付费阅读小程序源码,前端+后台+代理+分销
- 百度小程序全套源码下载、免费分享,一键生成百度小程序
- 程式CSCMSV4黑色炫酷DJ音乐门户模板 音乐网源码
- SpringBoot FK-关联表查询(三)
- SpringBoot FK-关联表查询(二)
- CodeSmith实用技巧(九):重载Render方法来控制输出