根据 Herb Sutter 的说法,下面的代码无法编译。请参阅此站点http://www.gotw.ca/gotw/066.htm,我从中提取了以下文本,涉及function-try-blocks
:
走向一些道德
顺便说一句,这也意味着构造函数函数try-block的唯一(仅重复)可能用途是转换从基子对象或成员子对象抛出的异常。这是道德#1。接下来,道德#2 说析构函数-try-blocks 完全没用——
“ - 可是等等!” 我听到有人从房间中间打断。“我不同意道德#1。我可以想到构造函数尝试块的另一种可能用途,即释放在初始化列表或构造函数主体中分配的资源!”
对不起,没有。毕竟,请记住,一旦进入构造函数 try-block 的处理程序,构造函数主体中的任何局部变量也已经超出范围,并且可以保证不再存在基子对象或成员对象。你甚至不能参考他们的名字。要么你的对象的部分从未被构建,要么那些被构建的部分已经被销毁。所以你不能清理任何依赖于引用类的基类或成员的东西(无论如何,这就是基类和成员析构函数的用途,对吧?)。
假设这个引用,下面的代码不应该编译,因为在进程运行到子句cat
时对象已经被破坏了。catch
但它确实如此,至少对于 VSC2008。
class Cat
{
public:
Cat() { cout << "Cat()" << endl; }
~Cat() { cout << "~Cat()" << endl; }
};
class Dog
{
public:
Dog() { cout << "Dog()" << endl; throw 1; }
~Dog() { cout << "~Dog()" << endl; }
};
class UseResources
{
class Cat *cat;
class Dog dog;
public:
UseResources();
~UseResources() { delete cat; cat = NULL; cout << "~UseResources()" << endl; }
};
UseResources::UseResources() try : cat(new Cat), dog() { cout << "UseResources()" << endl; } catch(...)
{
delete cat;
throw;
}