重载new()delete()的笔记----C++学习之路

来源:互联网 发布:重庆企业网站seo 编辑:程序博客网 时间:2024/05/09 05:15

  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的异常。







阅读全文
0 0
原创粉丝点击