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

时间:2018-01-31 00:34:34

标签: c++ singleton destructor

我有以下单线程实现:

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

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

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

2 个答案:

答案 0 :(得分:4)

析构函数未被调用,因为您在new没有调用delete的情况下调用m_data。我建议以下内容以避免手动分配,摆脱m_data

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

答案 1 :(得分:0)

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

您可以通过将其包含在main()

的末尾来解决此问题
delete pSingletone;

但你必须公开B::~B()