1.除了之前笔记中的重载,现在重载的是这样的表示:
Foo* pf = new(300,'c')Foo;
以下示例:
(1)一般的operator new()重载:
void* operator new(size_t size)
{
return malloc(size);
}
(2)这个就是标准库提供的placement new()的重载
void* operator new(size_t size,void* start)
{
return start;
}
(3)这是一个崭新的placement operator new()
void* operator new(size_t size,long extra)
{
return malloc(size+extra);
}
(4)这又是一个placement new
void* operator new(size_t size,long extra,char init)
{
return malloc(size+extra);
}
(5)这又是一个placement new,但是故意写错第一参数的type
void* operator new(long extra,char init)
{
return malloc(extra);
}
//[Error]'operator new'takes type 'size_t'('unsigned int') as first parameter
当然,我们也可以重载对应版本的delete(placement operator delete),但是它们绝不会被delete调用,只有当new所
调用的ctor抛出exception才会调用这些重载operator delete。
如何解释这一句话?
Foo(int){cout<<"Foo::Foo(int)"<<endl; throw Bad(); }
//这里故意抛出一场,测试placement operator delete
如果调用构造函数会有两个步骤,显示分配空间,然后调用ctor,那么假如这个构造函数抛出异常,说明构造失败,那么
我们就希望把这个分配出来的空间给删除。如果不删除,就会造成内存泄露。
即使写的operator new 与operator delete不能一一对应,也不会报错,如果不写delete的话,表示放弃处理ctor的异常。