为什么不调用全局静态变量的析构函数

Why destructor of global static variable is not called?

本文关键字:析构函数 变量 静态 调用 全局 为什么不      更新时间:2023-10-16

我有以下单调实现:

class B   
{
  public:
    static B *getInstance()
    {
        if ( !m_data )
          m_data = new(std::nothrow) B;
        return m_data;
    }
  private:
    static B *m_data;
  private:
    B() { std::cout << "B::B() " << B::m_data << std::endl; }
   ~B() { std::cout << "B::~B()" << std::endl; }
    B( const B & ) = delete;
    B &operator=( const B & ) = delete;
};

B *B::m_data = nullptr;

在main((中,我有:

B *pSingletone = B::getInstance();

我很惊讶地看到在我杀死我的程序后从未调用过析构函数。我错过了什么?在这种情况下,我们是否需要析构函数?我的问题只是关于析构函数,而不是单例有多坏或多好。我知道我不必在堆上分配它。

编辑总结:正如几个人指出的那样,只有静态指针在程序终止时被破坏,而不是它指向的对象。要销毁对象,需要显式"删除"。程序终止后,分配的内存当然会返回到系统,但没有析构函数调用。谢谢大家!

没有调用析构函数,因为您调用new而从未在m_data上调用delete。我提出以下建议以避免手动分配,摆脱m_data

static B *getInstance(){
    static B theInstance; // initialized during first call, destroyed after main exits
    return &theInstance;
}

为什么会调用析构函数? 您不会删除对象。 换句话说,您有内存泄漏。

您可以通过将其包含在main()末尾来解决此问题:

delete pSingletone;

不过,您必须公开B::~B()