• 2687阅读
  • 2回复

[提问]信号槽传QByteArray的内存泄露 [复制链接]

上一主题 下一主题
离线usethisname
 

只看楼主 倒序阅读 楼主  发表于: 2020-04-17

求解出现这个现象的原因。
代码如下:
    QThread threadA,threadB;
    WorkA *wa = new WorkA;
    WorkA *wb = new WorkA;
    wa->setObjectName("waaaaaaa");
    wb->setObjectName("wbbbbbbb");
    QByteArray aa("123123123");
    qDebug()<<"source add:"<<&aa;
    wa->moveToThread(&threadA);
    wb->moveToThread(&threadB);
//    wb->moveToThread(&threadA);
    QObject::connect(wa,&WorkA::sendWork,wb,&WorkA::dowork);
    QObject::connect(wb,&WorkA::sendWork,wa,&WorkA::dowork);
    QObject::connect(&threadA,&QThread::started,[&wa,&aa](){
        wa->dowork(aa);
    });
    threadA.start();
    threadB.start();


WorkA类定义如下:
class WorkA : public QObject
{
    Q_OBJECT
public:
signals:
    void sendWork(QByteArray data);
public slots:
    void dowork(QByteArray data)
    {
        QThread::msleep(20);
        qDebug()<<objectName()<<" data:"<<data<<",Add:"<<&data <<" ThreadId:"<<QThread::currentThreadId();
        emit sendWork(data);
    }
};


其中对于wb对象的线程操作,如果我使用wb->moveToThread(&threadB);,此时程序一直跑,内存不会增加;程序打印如下:
source add: 0x27f6f8
mainThread: 0x142c
"waaaaaaa"  data: "123123123" ,Add: 0x20af720  ThreadId: 0x1e4c
"wbbbbbbb"  data: "123123123" ,Add: 0x228bc80  ThreadId: 0x1bc0
"waaaaaaa"  data: "123123123" ,Add: 0x20abe40  ThreadId: 0x1e4c
"wbbbbbbb"  data: "123123123" ,Add: 0x228bc80  ThreadId: 0x1bc0
"waaaaaaa"  data: "123123123" ,Add: 0x20abe40  ThreadId: 0x1e4c
"wbbbbbbb"  data: "123123123" ,Add: 0x228bc80  ThreadId: 0x1bc0
"waaaaaaa"  data: "123123123" ,Add: 0x20abe40  ThreadId: 0x1e4c
"wbbbbbbb"  data: "123123123" ,Add: 0x228bc80  ThreadId: 0x1bc0
"waaaaaaa"  data: "123123123" ,Add: 0x20abe40  ThreadId: 0x1e4c
"wbbbbbbb"  data: "123123123" ,Add: 0x228bc80  ThreadId: 0x1bc0
...

;如果使用wb->moveToThread(&threadA);,则内存会一直增加;打印数据如下:
source add: 0x2bfa28
mainThread: 0xec
"waaaaaaa"  data: "123123123" ,Add: 0x225f570  ThreadId: 0x1174
"wbbbbbbb"  data: "123123123" ,Add: 0x225f160  ThreadId: 0x1174
"waaaaaaa"  data: "123123123" ,Add: 0x225ed50  ThreadId: 0x1174
"wbbbbbbb"  data: "123123123" ,Add: 0x225e940  ThreadId: 0x1174
"waaaaaaa"  data: "123123123" ,Add: 0x225e530  ThreadId: 0x1174
"wbbbbbbb"  data: "123123123" ,Add: 0x225e120  ThreadId: 0x1174
"waaaaaaa"  data: "123123123" ,Add: 0x225dd10  ThreadId: 0x1174
"wbbbbbbb"  data: "123123123" ,Add: 0x225d900  ThreadId: 0x1174
"waaaaaaa"  data: "123123123" ,Add: 0x225d4f0  ThreadId: 0x1174
"wbbbbbbb"  data: "123123123" ,Add: 0x225d0e0  ThreadId: 0x1174
"waaaaaaa"  data: "123123123" ,Add: 0x225ccd0  ThreadId: 0x1174
"wbbbbbbb"  data: "123123123" ,Add: 0x225c8c0  ThreadId: 0x1174
"waaaaaaa"  data: "123123123" ,Add: 0x225c4b0  ThreadId: 0x1174
...
离线liulin188

只看该作者 1楼 发表于: 2020-04-18
没看明白
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线xllwanlxy

只看该作者 2楼 发表于: 2020-04-18
首先,明确告诉你,不是内存泄露。

为什么wb->moveToThread(&threadB)内存不会增加呢?
wa和wb在不同的线程中,信号槽是事件队列的方式。

为什么wb->moveToThread(&threadA)时,内存会增加呢?
wa和wb在同一个线程,信号槽的连接是直接连接,相当陷入了一个递归调用。
快速回复
限100 字节
 
上一个 下一个