请选择 进入手机版 | 继续访问电脑版

技术控

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

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

[复制链接]
你能看穿我旳眸 发表于 2016-10-1 13:20:53
81 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的用法都做了举例:
        
  1. #include <new> // for placement new
  2. #include <string> // for string
  3. #include <iostream> // for cout
  4. using namespace std;
  5. int main(void)
  6. {
  7. void* buffer = ::operator new(sizeof(string)); // operator new
  8. buffer = new(buffer) string("123"); // placement new
  9. cout << *(string*)buffer << endl;
  10. // equals new operator
  11. string* str = new string("123");
  12. cout << *str << endl;
  13. delete str;
  14. ::operator delete(buffer);
  15. return 0;
  16. }
复制代码
      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的用法

C++当中3种new的用法-1-技术控-include,侯老师,表达式,两件



上一篇:Optimisations in Verve
下一篇:Danger, Caution H2O steam is very hot!!
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读


回页顶回复上一篇下一篇回列表
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )

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

返回顶部 返回列表