以下内容转自【 http://news.ccidnet.com/art/32855/20100713/2114025_1.html 】,有删改。
CONTENTS
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是你所拥有闲置内存的指针 buffer = new(buffer) string("abc"); //调用了placement 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"); ... delete ps; //调用delete表达式,先析构再释放内存 void* buffer = operator new(sizeof(string)); ... operator delete(buffer); //调用delete操作符,仅释放内存
那么为什么没有和 placement new对应的那个delete呢?其实是有的。placement new是在指定位置初始化对象,也就是调用了构造函数,因此与之对应的就是析构函数了,只不过它不叫placement delete而已。
void *pv = operator new(sizeof(vector<int>));//调用new操作符,申请内存 pv = new(pv) vector<int>(8, 0);//调用placement new,在已有内存上调用构造函数,构造实例 ... static_cast<vector<int>* >(pv)->~vector();//显式调用析构函数 operator delete(pv); //调用delete操作符,释放内存 pv = NULL;
以下内容节选自【 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不同的是,它在括号里多了另外一个参数。比如:
Widget * p = new Widget; //ordinary new pi = new (ptr) int; //placement new
括号里的参数ptr是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如括号中的传递参数)。
发表评论