我是靠谱客的博主 老实烤鸡,最近开发中收集的这篇文章主要介绍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();
}

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

最后

以上就是老实烤鸡为你收集整理的Qt内存管理(五) 自动垃圾回收机制的全部内容,希望文章能够帮你解决Qt内存管理(五) 自动垃圾回收机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部