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

Why destructor of global static variable is not called?

我有以下单例实现:

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();

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

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

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

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

delete pSingletone;

不过你必须B::~B() public。

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

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