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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值