以下内容转自【 http://news.ccidnet.com/art/32855/20100713/2114025_1.html 】,有删改。
new的用法
其一是new operator,也叫new表达式;其二是operator new,也叫new操作符。
new表达式比较常见,也最常用,例如:
string* ps = new string( "abc" ); |
上面这个new表达式完成了两件事情:申请内存和初始化对象。
new操作符类似于C语言中的malloc,只是负责申请内存,例如:
void * buffer = operator new ( sizeof (string)); |
注意这里多了一个operator。
第三个用法就不很常见了,官方的说法是placement new,它用于在给定的内存中初始化对象,也就是说你手中已有一块闲置的内存,例如:
void * buffer = operator new ( sizeof (string)); |
buffer = new (buffer) string( "abc" ); |
因此上面的【 new operator 】可以分解为两个步骤【 operator new 】和【 placement new 】。
delete的用法
与new对应的delete有两种用法,分别是delete operator和operator delete,也称为delete表达式和delete操作符。
delete表达式和new表达式对应,完成对象的析构和内存的释放操作。而delete操作符只是用于内存的释放,和C语言中的free相似。例如:
string* ps = new string( "abc" ); |
void * buffer = operator new ( sizeof (string)); |
那么为什么没有和 placement new对应的那个delete呢?其实是有的。placement new是在指定位置初始化对象,也就是调用了构造函数,因此与之对应的就是析构函数了,只不过它不叫placement delete而已。
void *pv = operator new ( sizeof (vector< int >)); |
pv = new (pv) vector< int >(8, 0); |
static_cast <vector< int >* >(pv)->~vector(); |
以下内容节选自【 http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html 】
Placement new的含义
placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替(不像普通版本的operator new和operator delete能够被替换)。实现代码如下:
void *operator new ( size_t , void * p ) throw () { return p; } |
placement new的执行忽略了size_t参数,只返还第二个参数。其结果是允许用户把一个对象放到一个特定的地方,达到调用构造函数的效果。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:
括号里的参数ptr是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如括号中的传递参数)。
发表评论