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参数外,还有别的参数)