我问一个问题,关于单执行几分钟前,我从@LightnessRacesinOrbit得到了很好的答案。
但是我不明白为什么在下一个示例中,如果我Singleton
在变量中实例化inst
其析构函数调用两次?
#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 inst = Singleton::getInstance();
应该
Singleton& inst = Singleton::getInstance();
然后,您只会看到一个析构函数调用。
编写方式Singleton::getInstance()
返回一个引用,然后将其复制到inst
。因此,Singleton
从函数返回的内容和副本均被销毁。您从未见过要构造副本,因为没有使用默认构造函数,而使用了副本构造函数。
在第二种方法中,将返回引用,那么您只需inst
对其进行引用即可,Singleton
而不是进行复制。
正如其他人提到的那样,您可以使该类不可复制且不可移动,以防止这种情况发生。
Singleton(Singleton const&) = delete; // Copy construct
Singleton(Singleton&&) = delete; // Move construct
Singleton& operator=(Singleton const&) = delete; // Copy assign
Singleton& operator=(Singleton &&) = delete; // Move assign
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句