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

static object gets never destroyed properly

本文关键字:正确地 对象 永远 静态      更新时间:2023-10-16

我有一个像这样实现的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没有被创建)。但是,正如本线程中所指出的,C++标准规定应该在最后调用析构函数。为什么在我的情况下不叫它?

我使用的是黑莓10,使用的是qcc编译器。

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

例如,调用abort()将在不离开当前块的情况下终止程序,因此不会破坏静态对象。根据系统的不同,程序因信号而终止可能导致静态不被破坏。

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

编译器和标准库需要一定数量的记账,以确保静态信息被销毁。一些旧的编译器并没有做得特别好,尽管现代编译器不太可能做到这一点。在C++11之前,在多线程代码中没有与静态结构的构建/破坏相关的要求(因为标准中有一个基本假设,即没有多线程)。

这不是真正的解决方案,但对于我的问题来说,这是一个足够的解决方法。我已经将我的处置代码放在连接到aboutToQuit()的插槽中——构造函数中的以下行:

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