好记性不如铅笔头

C && C++, C++ Primer, 编程

【转】C++中new的用法

以下内容转自【 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 operatoroperator 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的返回值是这个被构造对象的地址(比如括号中的传递参数)。

发表评论

5 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据