【发布时间】:2010-11-09 15:37:24
【问题描述】:
class Widget
{
public:
Widget() {
cout<<"~Widget()"<<endl;
}
~Widget() {
cout<<"~Widget()"<<endl;
}
void* operator new(size_t sz) throw(bad_alloc) {
cout<<"operator new"<<endl;
throw bad_alloc();
}
void operator delete(void *v) {
cout<<"operator delete"<<endl;
}
};
int main()
{
Widget* w = 0;
try {
w = new Widget();
}
catch(bad_alloc) {
cout<<"Out of Memory"<<endl;
}
delete w;
getch();
return 1;
}
在这段代码中,delete w 在析构函数存在时不会调用重载的delete 运算符。如果省略析构函数,则调用重载的delete。为什么会这样?
写入~Widget()时的输出
运营商新
内存不足
~Widget() 未写入时的输出
运营商新
内存不足
运算符删除
【问题讨论】:
-
这是一个非常有趣的问题!我刚刚查看了 Scott Meyer 的 Effective C++(不幸的是我只有第二版),对此一无所知。
标签: c++ memory-management destructor