gpt4 book ai didi

c++ - QThread内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:58 25 4
gpt4 key购买 nike

主要.cpp:

#include <QCoreApplication>
#include <QtCore>
#include "myobject.h"

QThread* cThread;
MyObject* cObject;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cThread = new QThread();
cObject = new MyObject();
cObject->moveToThread(cThread);

QObject::connect(cThread, SIGNAL(started()),
cObject, SLOT(doWork()));

QObject::connect(cThread, SIGNAL(finished()),
cThread, SLOT(deleteLater()));

QObject::connect(cThread, SIGNAL(finished()),
cObject, SLOT(deleteLater()));

cThread->start();

return a.exec();
}

我的对象.cpp:

#include "myobject.h"

MyObject::MyObject(QObject *parent) :
QObject(parent)
{
}

void MyObject::doWork()
{
qDebug() << "Hi";
QThread::currentThread()->quit();
return;
}

我的对象.h:

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QtCore>

class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = 0);

signals:

public slots:
void doWork();

};

#endif // MYOBJECT_H

显然,根据:https://stackoverflow.com/a/16062717 , 有内存泄漏,但我该如何解决呢?我想我必须返回到事件循环然后调用退出?但问题是我无权访问事件循环。

最佳答案

没有内存泄漏。如果您坚持其 object model,Qt 确实会正确清理, 和 object trees and ownership .我也喜欢关注 documented examples .

这是您引用的示例,在 deleteLater() 上添加了观察。

主要.cpp

#include <QCoreApplication>
#include <QtCore>
#include <QThread>

class MyThread : public QThread
{
Q_OBJECT
public slots:
void deleteLater()
{
qDebug() << Q_FUNC_INFO;
QThread::deleteLater();
}
};


class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = 0){}

signals:

public slots:
void deleteLater()
{
qDebug() << Q_FUNC_INFO;
QObject::deleteLater();
}

void doWork()
{
qDebug() << "Hi";
QThread::currentThread()->quit(); // It is supposed to stop here, but it doesn't.
return;
for (int i = 0; i < 1000000; i++) {
qDebug() << i;
}
}

};

QThread* cThread;
MyObject* cObject;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cThread = new MyThread();
cObject = new MyObject();
cObject->moveToThread(cThread);

QObject::connect(cThread, SIGNAL(started()),
cObject, SLOT(doWork()));

QObject::connect(cThread, SIGNAL(finished()),
cThread, SLOT(deleteLater()));

QObject::connect(cThread, SIGNAL(finished()),
cObject, SLOT(deleteLater()));

cThread->start();

return a.exec();
}

输出:

Hi
void __thiscall MyObject::deleteLater(void)
void __thiscall MyThread::deleteLater(void)

希望对您有所帮助。

关于c++ - QThread内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16113661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com