当前位置: 首页 > 知识库问答 >
问题:

在c语言中,单例(静态实例)在程序退出后将被销毁的原因是什么

尤俊誉
2023-03-14

提前感谢!

提到有效c项4,斯科特·迈耶斯说,一旦main()退出,所有静态变量/实例都将被销毁。这里,我们假设单例只在main()中使用。

事实上,我们知道如果我们同时使用以下两种形式的单例,那么一旦main()退出,实例就会自动销毁。但我想区分以下两个原因,哪一个是释放单身汉的直接原因?顺便问一下,这两种形式有什么区别?

原因:

>

  • 一旦main()退出,普通实例将被销毁。(与静态不相关)

    一旦main()退出,所有静态变量/实例都将被销毁。

    案例1:

    //辛格尔顿。H

    class Singleton
    {
    private:
       Singleton();
       ~Singleton();
    public:
       Singleton& Instance()
       {
          Return instance_;
       }
       static Singleton instance_;
    };
    

    //Singleton. c

    Singleton Singleton::instance_
    

    实例销毁步骤:

    1. 参考有效c项4,静态instance_将被编译器释放。这是原因2。

    案例2:

    //辛格尔顿。H

    class Singleton
    {
    private:
       Singleton();
       ~Singleton();
    public:
       Singleton& Instance()
       {
          static Singleton instance_;
          Return instance_;
       }
    
    };
    

    实例销毁步骤:

    >

  • 一旦程序退出,就调用单例的析构函数

    然后析构函数将释放所有成员,但不会释放类中的任何成员。这是原因1。

    然后编译器将释放所有静态变量/实例,包括instance_,这不是类析构函数的工作。这就是原因2。

  • 共有1个答案

    柴砚文
    2023-03-14

    从C 11标准:

    3.6.3终止

    1具有静态存储持续时间的初始化对象(即其生命周期(3.8)已经开始的对象)的析构函数(12.4)被调用,这是从main返回的结果,也是调用std::e的结果xit(18.5)。

    在这两种情况下,单例对象都是静态的存储持续时间。

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

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

     类似资料:
    • 这里已经阐明了和之间的区别。 但我的问题是,为什么我们要使用关键字?从生成的Java代码角度来看没有区别。 静态编程语言代码: 生成:

    • 问题内容: 我有一个设置为启动Java活动(称为MyJavaActivity)的android应用,这反过来又会启动NativeActivity。NativeActivity完成后,它将返回到MyJavaActivity。 我还有一个Java单例类(称为MyJavaSingleton),我希望在应用程序的整个生命周期中都将其保留在内存中。我从NativeActivity(使用JNI)中设置了一些单

    • 我在学习保存的InstanceState捆绑包时感到困惑。我发现,在调用onDestroy()方法后,活动实例没有被销毁,或者它可以在没有SavedInstanceState Bundle帮助的情况下保存数据。 这是我的测试代码: 这里是日志信息: 除非我在手机上完全杀死进程,否则testNum永远不会返回到1,在我看来,活动实例并没有真正被销毁,所以我们不需要重写onSaveInstanceSt

    • 我有一个片段,它设置一个列表视图,并创建一个处理程序来定期更新列表视图。然而,看起来处理程序在片段被销毁后仍然运行。 以下是代码。 在被销毁后更新会导致应用程序崩溃。如何在被销毁时使停止?我还想知道如果应用程序的任何暂停对也有什么影响。

    • 如何在静态编程语言中实现等效于遵循Java语句代码?

    • 本文向大家介绍C语言实现堆排序的简单实例,包括了C语言实现堆排序的简单实例的使用技巧和注意事项,需要的朋友参考一下 本文通过一个C语言实现堆排序的简单实例,帮助大家抛开复杂的概念,更好的理解堆排序。 实例代码如下: