gpt4 book ai didi

c++ - 在 C++ 中,单例(静态实例)一旦程序退出就会被销毁的原因是什么

转载 作者:行者123 更新时间:2023-11-28 05:57:47 27 4
gpt4 key购买 nike

提前致谢!

关于 Effective c++ item 4,Scott Meyers 说一旦 main() 退出,所有静态变量/实例都将被销毁。在这里,我们假设单例仅在 main() 中使用。

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

原因:

  1. 普通实例将在 main() 退出后销毁。 (与静态无关)

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

案例 1:

//Singleton.h

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

//Singleton.c

Singleton Singleton::instance_

实例销毁步骤:

  1. 引用Effective c++ item 4,static instance_ 将由编译器释放。这是原因 2。

案例 2:

//Singleton.h

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

};

实例销毁步骤:

  1. 单例的析构函数在程序退出时被调用。

  2. 然后析构函数将释放所有成员,但不释放类内的成员。这是原因 1。

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

最佳答案

来自 C++11 标准:

3.6.3 Termination

1 Destructors (12.4) for initialized objects (that is, objects whose lifetime (3.8) has begun) with static storage duration are called as a result of returning from main and as a result of calling std::exit (18.5).

在这两种情况下,单例对象都是static 存储期。

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

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

关于c++ - 在 C++ 中,单例(静态实例)一旦程序退出就会被销毁的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33820494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com