静态对象永远不会被正确销毁

时间:2015-02-14 21:33:03

标签: c++ blackberry-10

我有一个像这样实现的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编译器。

2 个答案:

答案 0 :(得分:1)

它可能会受到程序终止方式的影响。

例如,调用abort()将终止程序而不离开当前块,因此不会销毁静态对象。由于信号而终止程序可能 - 取决于系统 - 导致静态不会被破坏。

这些问题的显而易见的解决方案是仅通过返回main()并从main()返回来退出程序。

编译器和标准库需要一定量的簿记才能确保统计数据被销毁。一些较旧的编译器并没有那么特别好,尽管使用现代编译器的可能性较小。在C ++ 11之前,在多线程代码中没有与构造/破坏静态相关的要求(因为标准中没有多线程的基本假设)。

答案 1 :(得分:0)

这不是真正的解决方案,而是针对我的问题的充分解决方法。我已将处理代码放到连接到aboutToQuit()的插槽中 - 构造函数中的以下行:

connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(onDestroy()));