我有一个像这样实现的Singleton类:
class QueueManager : public QObject
{
Q_OBJECT
public:
static QueueManager *instance() {
static QueueManager ins;
return &ins;
}
private:
QueueManager(QObject *parent = 0);
~QueueManager() {
system("touch ./shared/documents/exec.txt");
}
};
我意识到永远不会调用~QueueManager()
(不会创建exec.txt)。但是,正如this thread中所指出的,C ++标准说最终应该调用析构函数。为什么我的情况没有被调用?
我在BlackBerry 10上使用qcc编译器。
答案 0 :(得分:1)
它可能会受到程序终止方式的影响。
例如,调用abort()
将终止程序而不离开当前块,因此不会销毁静态对象。由于信号而终止程序可能 - 取决于系统 - 导致静态不会被破坏。
这些问题的显而易见的解决方案是仅通过返回main()并从main()返回来退出程序。
编译器和标准库需要一定量的簿记才能确保统计数据被销毁。一些较旧的编译器并没有那么特别好,尽管使用现代编译器的可能性较小。在C ++ 11之前,在多线程代码中没有与构造/破坏静态相关的要求(因为标准中没有多线程的基本假设)。
答案 1 :(得分:0)
这不是真正的解决方案,而是针对我的问题的充分解决方法。我已将处理代码放到连接到aboutToQuit()
的插槽中 - 构造函数中的以下行:
connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(onDestroy()));