码迷,mamicode.com
首页 > 其他好文 > 详细

new、operator new、placement new

时间:2016-08-30 19:45:50      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

new :操作符

  class MyClass {...}; 
   MyClass *p = new MyClass; 

分以下三个步骤

1. 调用operator new分配内存

2. 调用构造函数生成类对象

3. 返回相应指针

operator new:分配内存

1.缺省情况下,C++在global作用域内提供以下三种形式的operator new

void* operator new(std::size_t)throw(std::bad_alloc);  //正常的operator new,new MyClass分配空间调用的即为该函数

void* operator new(std::size_t, void*)throw();       //placement new:带有除size_t外的参数;void*表示已分配的空间,该函数表示在已分 配的空间上去创建对象;已  被纳入C++标准,需#include <new>

void* operator new(std:;size_t,std:Lnothrow_t&) throw(); //nothrow new

placement new:对operator new的重载,在已分配的空间上创建对象

大家谈到的placement new大多为此版本:void* operatornew(std::size_t, void*) throw();

注意点:

1.placement new还可在自身类中定义带各种不同参数版本,如:void* operator new(std::size_t, std::ostream&logStream);

2.需定义匹配的placement delete,void* operatordelete(void* pMemory, std::ostream& logStream);

        否则系统找不到匹配的placement delete,有可能导致内存泄露;  只有在“伴随placement new 调用而触发的构造函数出现异常时才会被调用”,如:Widget* pw = new (std::err) Widget;构造函数出现异常,会调用该版本的placement delete

3.delete pw; //只会调用正常的operator delete:void operatordelete(void *pMemory) thorw();,而不会调用placement delete(表示除带有void* pMemory参数外,还有别的参数)

new、operator new、placement new

标签:

原文地址:http://www.cnblogs.com/zjqianzi/p/5823211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!