`
isiqi
  • 浏览: 16049353 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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:

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

简单做法如下:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics