剑客
关注科技互联网

C++当中3种new的用法

最近在看侯捷侯老师的著作《STL源码剖析》,书中第二张开始讲到了stl中的allocator的一个简易实现,发现原来cpp中的new其实除了我们平常用的最多的new表达式(new operator)之外,还有剩下两种用法。

1. new operator

new operator,也叫new表达式,是我们在cpp中最常见的new的用法,比如:

string *pStr = new string(“abd”);

这个new表达式完成了两件事情:申请内存和调用类的构造函数初始化对象。

2. operator new

operator new,也叫new操作符,容易和new operator搞混。new 操作符类似与c当中的malloc库函数,只负责申请内存,例如:

void *buffer = ::operator new(sizeof(string));

3. placement new

placement new,它用于在给定的内存中初始化对象,例如

void *buffer = ::operator new(sizeof(string));

buffer = new(buffer) string(“abd”);

这里我们可以这么理解,new表达式(new operator)其实可以分解为两部,即先调用new操作符(operator new)申请内存,再调用placement new来初始化对象。

来看一个例子,例子中对3个new的用法都做了举例:

#include <new> // for placement new
#include <string> // for string
#include <iostream> // for cout
using namespace std;

int main(void)
{
 void* buffer = ::operator new(sizeof(string)); // operator new
 buffer = new(buffer) string("123"); // placement new
 cout << *(string*)buffer << endl;

 // equals new operator
 string* str = new string("123");
 cout << *str << endl;

 delete str;
 ::operator delete(buffer);

 return 0;
}

4. delete的两种用法

与new对应的delete操作符没有3中用法,只有两种,分别是delete表达式(delete operator)和delete操作符(operator delete)。delete表达式和new表达式对应,即我们最常用的delete用法,完成对对象的析构和内存的释放。而delete操作符只用于内存的释放,和c语言中的free相似。

那么为什么没有和 placement new对应的那个delete呢?其实是有的。placement new是在指定位置初始化对象,也就是调用了构造函数,因此与之对应的就是析构函数了,只不过它不叫placement delete而已。

5. 什么时候需要用到operator new和placement new

其实在stl里面的allocator就需要用到,allocator先向系统申请一块指定大小的内存(operator new)然后在这块内存上根据模板类的类型T来调用T的构造函数初始化内存(placement new)。下面是一个简单的allocator实现,画红线部分即为两种new和两种delete的用法。

C++当中3种new的用法

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址