技术控

    今日:75| 主题:49471
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] C++当中3种new的用法

[复制链接]
你能看穿我旳眸 发表于 2016-10-1 13:20:53
65 0

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
最近在看侯捷侯老师的著作《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的用法都做了举例:
         [code]#include // for placement new
#include // for string
#include // 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;
}
[/code]       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的用法-1 (include,侯老师,表达式,两件)

友荐云推荐




上一篇:Optimisations in Verve
下一篇:Danger, Caution H2O steam is very hot!!
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表