提前感谢!
提到有效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_
实例销毁步骤:
案例2:
//辛格尔顿。H
class Singleton
{
private:
Singleton();
~Singleton();
public:
Singleton& Instance()
{
static Singleton instance_;
Return instance_;
}
};
实例销毁步骤:
>
一旦程序退出,就调用单例的析构函数。
然后析构函数将释放所有成员,但不会释放类中的任何成员。这是原因1。
然后编译器将释放所有静态变量/实例,包括instance_,这不是类析构函数的工作。这就是原因2。
从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语言实现堆排序的简单实例,帮助大家抛开复杂的概念,更好的理解堆排序。 实例代码如下: