首页 文章

在c中,一旦程序退出,单个(静态实例)将被销毁的原因是正确的

提问于
浏览
0

提前致谢!

参考有效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 回答

  • 1

    从C 11标准:

    3.6.3终止1具有静态存储持续时间的初始化对象(即,其生命周期(3.8)已开始的对象)的析构函数(12.4)由于从main返回并且由于调用std :: exit而被调用( 18.5) .

    在这两种情况下,单例对象都具有 static 存储持续时间 .

    在第一种情况下,始终初始化对象 . 始终在终止时调用对象的析构函数 .

    在第二种情况下,只有在至少调用一次 Singleton::Instance() 时才会初始化对象 . 否则,对象将保持未初始化状态 . 如果未初始化对象,则不会调用对象的析构函数 . 如果初始化对象,则将在终止时调用析构函数 .

相关问题