为什么不调用全局静态变量的析构函数?
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;
}
我有以下单例实现:
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;
}