Qt内存管理(五) 自动垃圾回收机制

实现自动垃圾回收的工具主要是Qt对象清理器,也就是QObjectCleanupHandler类,它监视多个QObject对象的生命期。当你想知道被别人拥有的QObject对象是否被删除时,这个类就派上了用场。例如引用(referencing memory)了程序中的共享库内存的场合。

为了追踪某些QObject对象,使用add()添加对象,不再跟踪时使用remove()。被cleanup handler追踪的对象在别处被删除后,它会自动将其remove。要删除所有添加的对象用clear()或者销毁cleanup handlerisEmpty()判断是否其中还有对象。

这个类的源码很简单:

class Q_CORE_EXPORT QObjectCleanupHandler : public QObject
{
    Q_OBJECT
public:
    QObjectCleanupHandler();
    ~QObjectCleanupHandler();

    QObject* add(QObject* object);
    void remove(QObject *object);
    bool isEmpty() const;
    void clear();
private:
    // ### move into d pointer
    QObjectList cleanupObjects;
private Q_SLOTS:
    void objectDestroyed(QObject *);
};

add函数很简单:

QObject *QObjectCleanupHandler::add(QObject* object)
{
    if (!object)
        return 0;
    connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
    cleanupObjects.insert(0, object);
    return object;
}

实际就是连接了destroyed信号,再将QObject对象插入链表中,objectDestroyed槽函数实际就是remove函数:

int index;
if ((index = cleanupObjects.indexOf(object)) != -1)
{
    cleanupObjects.removeAt(index);
    disconnect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed QObject*)));
}

析构函数实际调用clear():

void QObjectCleanupHandler::clear()
{
    while (!cleanupObjects.isEmpty())
        delete cleanupObjects.takeFirst();
}

使用比较简单,参考这篇文章吧。

猜你喜欢

转载自blog.csdn.net/yao5hed/article/details/81092178
今日推荐