我有以下单线程实现:
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();
我很惊讶地看到在我杀死程序后从未调用过析构函数。我错过了什么?在这种情况下,我们是否需要析构函数? 我的问题只是关于析构函数,而不是单身者的坏或好。我知道我不必在堆上分配它。
编辑总结:正如几位人士指出的那样,只有静态指针在程序终止时被破坏,而不是它所指向的对象。要破坏对象,需要显式“删除”。程序终止后,分配的内存当然会返回给系统但没有析构函数调用。谢谢大家!
答案 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()
。