何时用单例替换全局std :: unique_ptr

时间:2013-04-18 16:41:46

标签: c++

一位同事坚持将Meyer的Singleton用于所有全局指针变量,因为“不能保证全局unique_ptr的构造不会抛出”。所以而不是:

#include <memory>

std::unique_ptr<Foo> ptr(nullptr); // Apparently this isn't safe.

int main(/*blah*/)
{
    ptr.reset(new Foo());
}

我们现在有

unique_ptr<Foo> singleton
{ 
    try 
    { 
        static unique_ptr<Foo> ptr(); 
        return ptr; 
    } 
    catch (...) 
    { 
        std::cerr << "Failed to create single instance\n"; 
        exit(1); 
    } 
    return unique_ptr<Type>(); 
}

int main()
{
}

对我而言,这似乎是寻找问题的解决方案。他有意见吗?

2 个答案:

答案 0 :(得分:21)

您的同事不正确(或者可能只是过时,unique_ptr的预标准版本可能会有所不同)。 nullptr_t的{​​{1}}构造函数保证不会抛出(20.7.1.2):

unique_ptr

因为它也是constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {} (并且因为constexpr是一个常量表达式),所以需要在常量初始化期间初始化它(3.6.2 / 2)。所以控制初始化顺序(Meyers单例可能有用的另一个原因)也不适用于此。

答案 1 :(得分:2)

  

“无法保证全局unique_ptr的构造不会抛出”

如果它抛出,会发生什么?应用程序终止,尽管如果你没有捕获异常,标准没有指定堆栈是否被解除(作为全局变量,没有地方可以捕获异常)。我不清楚所提议的解决方案是如何明显改进的。