qt有内存回收机制,如果在qt中单例模式使用的不正确,退出的时候程序可能会崩溃。
原因是qt程序在窗口关闭的时候或者程序退出的时候都会销毁继承于QObject对象的内存。
但是如果静态内存释放的时候会崩溃,因为静态的变量存储于静态区,程序无法释放,如果强制释放的时候就会崩溃。
举个例子,比如,我们的程序只有一个主窗口,我们可以把主窗口用单例模式来创建,
LiveClientMainWidget * LiveClientMainWidget::getInstance()
{
static LiveClientMainWidget instance;
return & instance;
}
上面这段代码存在问题,如果程序退出时,对主窗口的指针进行释放的时候就会出问题,因为这个对象的存储于静态全局区,静态全局区的变量是无法释放的。
索引必须采用以下的用法,这样new的变量存储于堆中,所以程序退出的时候释放就不会崩溃。
LiveClientMainWidget * LiveClientMainWidget::getInstance()
{
if (m_mainWidget == nullptr)
{
m_mainWidget = new LiveClientMainWidget();
}
return m_mainWidget;
}