我几分钟前问了一个关于单例实现的问题,从@LightnessRacesinOrbit那里得到了非常好的答案。
但是我不明白为什么在下一个示例中,如果我在变量inst
中实例化Singleton
,它的析构函数会被调用两次?
#include <iostream>
class Singleton
{
public:
~Singleton() { std::cout << "destruction!\n"; }
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}
void foo() { std::cout << "foo!\n"; }
private:
Singleton() { std::cout << "construction!\n"; }
};
int main()
{
Singleton inst = Singleton::getInstance();
inst.foo();
}
输出:
construction!
foo!
destruction!
destruction!
更准确地说,我理解为什么会调用两次。但是,如果在第一个析构函数之后类的实例已被销毁,我就不明白它怎么可能被调用两次了呢?为什么没有异常抛出?
或者说它并没有被销毁吗?为什么?
Singleton(Singleton const&) { std::cout << "copy construction!\n"; }
添加到您的示例中,就会揭示一切。 - PraetorianSingleton(Singleton const&) = delete; Singleton(Singleton &&) = delete; Singleton &operator=(Singleton const&) = delete;Singleton operator=(Singleton &&) = delete;
- bames53Singleton
类型的实例。一个是getInstance
中的static
,另一个是main
中的本地变量。每个对象最终都会被销毁,因此有两个析构函数调用。为什么你会对析构函数被调用两次感到惊讶呢? - AnT stands with Russia