提前致谢!
参考有效c项目4,Scott Meyers表示,一旦main()退出,所有静态变量/实例都将被销毁 . 在这里,我们假设单例仅用于main() .
实际上,我们知道如果我们使用以下两种形式的单例,一旦main()退出,实例将被自动销毁 . 但是我想区分下面两个原因,哪一个是释放单身人士的直接原因?顺便说一句,这两种形式有什么区别?
Reason:
一旦main()退出,
-
普通实例将被销毁 . (与静态无关)
-
一旦main()退出,所有静态变量/实例都将被销毁 .
case 1:
//Singleton.h
class Singleton
{
private:
Singleton();
~Singleton();
public:
Singleton& Instance()
{
Return instance_;
}
static Singleton instance_;
};
//Singleton.c
Singleton Singleton::instance_
Instance destruction step:
- 参考有效c项目4,静态实例_将由编译器释放 . 这是原因2 .
case 2:
//Singleton.h
class Singleton
{
private:
Singleton();
~Singleton();
public:
Singleton& Instance()
{
static Singleton instance_;
Return instance_;
}
};
Instance destruction step:
-
一旦程序退出就会调用单例的析构函数 .
-
然后析构函数将释放所有成员,但类中没有成员 . 这是原因1 .
-
然后编译器将释放所有静态变量/实例,包括instance_,这不是类析构函数的工作 . 这是原因2 .
1 回答
从C 11标准:
在这两种情况下,单例对象都具有
static
存储持续时间 .在第一种情况下,始终初始化对象 . 始终在终止时调用对象的析构函数 .
在第二种情况下,只有在至少调用一次
Singleton::Instance()
时才会初始化对象 . 否则,对象将保持未初始化状态 . 如果未初始化对象,则不会调用对象的析构函数 . 如果初始化对象,则将在终止时调用析构函数 .