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

局部静态物体的静态破坏

方飞鸣
2023-03-14

帮我理解这个...参见粗体。从标准3.6.3终止(2)

如果一个函数包含一个静态或线程存储持续时间的块作用域对象,该对象已经被破坏,并且该函数在一个静态或线程存储持续时间的对象被破坏期间被调用,如果控制的信息通过了先前被破坏的blockscope对象的识别,则该程序具有未被修改的行为。同样,如果块作用域对象在销毁后被间接使用(即通过指针),则该行为将被忽略。

Manager& GetManager()
{
    static Manager localMan;
    return localMan;
}
{
   static User localUser;
   localUser.DoSomething(); //localUser calls GetManager and uses the reference returned.
}
User::~User()
{
   GetManager().DoSomethingOneLastTime();
}

//Now lets say Main exits and static destruction begins.
//Somehow localMan is destructed before User.
//Then user calls the GetManager() function in it's destructor.
//What case is this defined, and what case makes this undefined?

有人对此有明确的见解吗?

共有1个答案

缑智敏
2023-03-14

我相信这里的关键短语是

是否创建新静态

如果这种情况发生在静态对象的销毁过程中,并且会导致一些已经销毁的静态对象的重新创建,那么它们将在何时被销毁?如果导致循环怎么办?系统应该如何跟踪这一切?可能的好处值得麻烦吗?

可能不会,因为语言标准明确决定不对此进行定义。

 类似资料:
  • 问题内容: 是否可以在Go中定义一个局部变量,该局部变量可以从一个函数调用到另一个函数保持其值?在C语言中,我们可以使用保留字。 在C中的示例: 问题答案: 使用闭包: 函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可以访问它们就可以保留。 它不必在全局范围内,只需在函数定义之外即可。 (去操场上的样本)

  • 问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以

  • 我想知道这样的声明在Java是否有某种真正的意义。我在代码中发现了它几千次,但是我学习和玩字符串,我知道无论你声明一个对象多少次:如果你之前的某个类声明了这个字符串,它就会被汇集并重用(我说的是没有显式构造函数调用而创建的字符串) 事实上,这段代码在调用比较时打印,因此两个变量引用同一个对象。说变量无法重新定义,在这种情况下单词完全没有用。我是不是没抓住重点? 还有几件事: 1 - 为什么显式调用

  • 问题内容: 如果存在Kotlin语言,可以用什么替代方法?如果没有,当我需要在Kotlin中使用时如何解决此问题?请参见下面的代码示例: 我搜索了很多东西,没有发现任何东西,非常感谢。 问题答案: 只需在Kotlin中省略。 内部类(持有对外部对象的引用) Java: 科特林: 静态内部类又称为嵌套类(不引用外部对象) Java: 科特林:

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该