Item 52 new/delete成对儿出现

● 通用概念
Widget *pw = new Widget;
其实分为两步:
1> 调用operator new分配内存
2> 调用ctor初始化对象

如果第2步抛出异常,系统会自动调用
1> void operator delete(void *mem) throw();
2> void Widget::operator delete(void *mem, std::size_t size) throw();
二者之一来回收内存。

系统查找和new对应的delete时是一一对应。如果对于一个placement new没有给出placement delete,则无法回收内存。
所以,自定义new/delete时要保持一一对应:

 

此时若出现异常,系统会自动找到带ostream的delete。

● STL中有一个placement new:
void* operator new(std::size_t, void *pMemory) throw();
该函数用于vector在内部给新对象寻找存储位置。placement new因此而得名。placement是名词“安置、寻找合适位置”的意思。
现在一般意义上,只要带有多余参数的new都叫placement new。系统在匹配placement new和placement delete时,也是靠比较那些多余的参数而完成的。

● Item 33讲了类在派生的时候,如果重名就会发生定义遮挡的问题:

 

先要了解C++预定义的new:

这些都是你要在你的类里重定义的。

简单做法如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值