静态初始化的对象不能放在块中尝试



我正在阅读《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)
    {
    }
}

相关内容

  • 没有找到相关文章

最新更新