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

  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值