Singleton_Design_Pattern_In_Qt
问题描述
在开发的Qt C++项目中,发现每次程序退出时都会发生崩溃,通过调试发现崩溃发生在单例对象的析构方法中。
问题分析
原代码使用了函数局部静态对象的单例模式:
1 | static ExperimentsBrowser *instance() |
当 MainWindow::initDockWidgets() 调用 addDockWidget() 或 splitDockWidget() 时,Qt 会把 dock widget 重新设置为 MainWindow 的子对象(Qt 文档:”If dockwidget is not a child of this main window, it becomes a child.”)。
退出流程:
1. main() 返回 → 栈上 scrollArea 析构 → 删除 MainWindow
2. MainWindow 析构 → Qt 遍历子对象树,delete 了单例 dock widget(第一次析构)
3. main() 完全返回后,C++ 运行时按逆构造顺序析构静态存储对象 → 又对已释放的内存调一次析构 → 崩溃