码迷,mamicode.com
首页 > 编程语言 > 详细

[C++]placement new 定位new 表达式

时间:2019-01-15 15:51:55      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:oid   操作   ESS   init   operator   ++   turn   class   throw   

默认的new 把内存开辟到堆区,大小可以指定,也就是做两件事情:(1)分配内存。(2)在分配好的内存上构建对象。原型如下:

void *operator new( size_t, void * p ) throw() { return p; }

placement new 是new的一个变体,它将两者分开来做。在placement new中,我们可以传递一个已经分配好的内存然后在这个内存上构建对象。这样,可以在指定地址区域(栈区、堆区、静态区)构造对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。
例如:

inline void construct (T1* p,const T2& value){
  new(p) T1(value);//placement new; 调用 T1:;T1(value);
}

定位new的常见表达式

new(address) type;
new(address) type(initializers);
new(address) type[size];
new(address) type[size]{braced initializer list};

new vs placement new

默认的new在堆上分配内存和构建对象,而placement new 则在已知的地址上构建对象。
用默认的new是不能知道究竟在哪个内存地址上构建的对象,而placement构建的对象的地址是可知的
用delete操作符可以解除new已分配的地址,但并没有place析ment delete,但你也可以在构函数里写一个。

参考:C++Prime 3 e 8.4 动态分配对象

[C++]placement new 定位new 表达式

标签:oid   操作   ESS   init   operator   ++   turn   class   throw   

原文地址:https://www.cnblogs.com/drunknbeard/p/10271779.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!