首页 > 代码库 > new、operator new、placement new

new、operator new、placement new

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