c++ - 为什么在 Singleton 的析构函数中调用 exit() 会导致无限循环?

标签 c++ singleton infinite-loop destructor

在 Singleton 的析构函数中调用 exit() 会导致无限循环,这只发生在 singleton 类中,在其他地方也能正常工作!这是代码:

#include <iostream>
#include <stdlib.h>
class Singleton{
      private  :
      Singleton(){}
      public : // public destructor , allow 'delete' or whatever , not our subject
      ~Singleton()
      {
       std::cout<<"~Singleton()"<<std::endl;
       exit(0);            
      }
      static Singleton * GetInstance()
      {
        static Singleton s;
        return &s;    
      }
      };
int main()
{
   // Signleton s; , this is safe when the constructor is public
    Singleton::GetInstance(); // this enter an infinate loop
  return 0;   
}

输出:

~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
~Singleton()
....

最佳答案

这不足为奇。

在调用 exit 期间,C++ 运行时调用析构函数来处理所有具有 static 存储的对象。

如果你不能修复这个有问题的设计,那么在析构函数中放一些东西来阻止递归。

关于c++ - 为什么在 Singleton 的析构函数中调用 exit() 会导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40527253/

相关文章:

c++ - 仅当某些值在 C++ 中保持不变时才读取某些列

C++ Cereal 反序列化问题与大尺寸 vector

c++ - 根据用户输入计算数组中的可整除数

java - 如何让多个线程和类写入 Java 中的同一个日志文件?

haskell - 为什么这个定点计算不停止?

c++ - 通用输出类签名的正确类型

java - 我们什么时候应该在 Java 中使用 Singleton 类?

spring - Spring @autowired 是否不适用于非单例容器?

java stackoverflowerror 在无限循环中抛出

sql - SQL中的无限循环?