欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-04 11:04:56
...

实现自动垃圾回收的工具主要是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();
}

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

相关标签: 内存管理