我正在阅读《C++对象模型内部》一书,我得到了如下一段话:
使用静态初始化有许多缺点 对象。例如,如果支持异常处理,则这些 对象不能放置在 try 块中。这可能特别 对静态调用的构造函数不满意,因为任何抛出 将不可避免地触发默认的 terminate(( 函数 异常处理库。
如果我没看错,这意味着
MyGlobalObject obj;
int main()
{
try
{
// do something with obj here is unsatisfactory
}
catch(...){}
return 0;
}
不好。但我不知道为什么。为什么任何抛掷都是必要的,触发默认的 terminate(( 函数。
这意味着
您无法从静态初始化的对象中捕获异常,因为它们是在main()
开始之前初始化的,因此无法用try{}
块包围它们。
MyGlobalObject obj; // this initializes before main() starts
int main()
{
try
{
// too late to protect the static initialized global
// with this try block during its initialization
// but any operations you perform on it afterwards
// inside this try{} block will be fine.
}
catch(std::exception const& e)
{
}
}
一种解决方案是将静态对象放在如下所示的函数中:
MyGlobalObject& get_my_global_object()
{
// This will not initialize until this function
// is called for the first time.
static MyGlobalObject obj;
return obj;
}
int main()
{
try
{
// now if the global object throws during its
// initializatin the exception will be caught.
MyGlobalObject& obj = get_my_global_object();
}
catch(std::exception const& e)
{
}
}