10

一位同事坚持对所有全局指针变量使用 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()
{
}

对我来说,这似乎是寻找问题的解决方案。他有道理吗?

4

2 回答 2

21

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

constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}

由于它也是constexpr(并且因为nullptr是常量表达式),因此需要在常量初始化期间对其进行初始化(3.6.2/2)。因此控制初始化顺序(Meyers 单例可能有用的另一个原因)也不适用于此处。

于 2013-04-18T16:47:25.857 回答
2

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

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

于 2013-04-18T16:45:26.790 回答