为什么不调用全局静态变量的析构函数
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();
我很惊讶地看到在我杀死我的程序后从未调用过析构函数。我错过了什么?在这种情况下,我们是否需要析构函数?我的问题只是关于析构函数,而不是单例有多坏或多好。我知道我不必在堆上分配它。
编辑总结:正如几个人指出的那样,只有静态指针在程序终止时被破坏,而不是它指向的对象。要销毁对象,需要显式"删除"。程序终止后,分配的内存当然会返回到系统,但没有析构函数调用。谢谢大家!
没有调用析构函数,因为您调用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()
。
相关文章:
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 使用线程销毁类析构函数中的shared_ptr成员变量
- 为什么不调用全局静态变量的析构函数
- cpp 中的析构函数是否自动调用?即使析构函数没有提及非动态变量,它们也会被删除吗?
- 返回堆栈变量时停止调用析构函数
- 如何使用非平凡析构函数防止未使用的变量警告
- 如何释放C++异常类析构函数中的变量
- 为什么msvc编译器在显式调用析构函数时会发出未使用的变量
- 当变量仍然存在时调用C++析构函数
- 为静态分配的变量手动调用析构函数
- 人造人.NDK.如何记录全局变量的调用析构函数
- 在析构函数调用后访问成员变量
- 为什么析构函数不修改返回的变量
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 在C++中,析构函数的调用顺序和成员变量的销毁顺序是什么
- 对变量范围感到困惑 - 析构函数意外调用
- 您是否需要析构函数来销毁全局 int、float 或 std::string 变量
- 全局变量析构函数中的 ctrl-c 上的 AV
- C++禁用静态变量的析构函数
- 析构函数在(堆栈)变量之间的赋值时调用