线程内使用emit(),内存泄漏十分严重,哪里出了问题?有源代码

weixin_38049770 2019-09-19 12:39:54
一个十分简单的QT程序,线程启动后内存泄漏十分严重。QT新手请高手指点。谢谢!!复制代码//main.cpp#include "test_thread.h"#include <QtWidgets/QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    Test_Thread w;    w.show();    return a.exec();}复制代码//test_thread.h#ifndef TEST_THREAD_H#define TEST_THREAD_H#include <QtWidgets/QMainWindow>#include "ui_test_thread.h"#include <QtWidgets/QTextBrowser>#include <QtWidgets/QWidget>#include <QtWidgets/QLayout>#include<QtCore/QThread>  #include "mythread.h"class Test_Thread : public QMainWindow{    Q_OBJECTpublic:    Test_Thread(QWidget *parent = 0);    ~Test_Thread();    Ui::Test_ThreadClass ui;    QWidget *widget;    QVBoxLayout *layout;    QTextBrowser *textBrowser;private:    void creat_Label();    QThread * t2 = new QThread();    MyObject * obj1 = new MyObject();};#endif // TEST_THREAD_H复制代码//test_thread.cpp#include "test_thread.h"#include <QtCore/QDebug>Test_Thread::Test_Thread(QWidget *parent)    : QMainWindow(parent){    ui.setupUi(this);    widget = new QWidget;    layout = new QVBoxLayout;    textBrowser = new QTextBrowser;    layout->addWidget(textBrowser);    widget->setLayout(layout);    setCentralWidget(widget);//在主窗口上显示    //把对象移动到新线程      obj1->moveToThread(t2);    t2->start();    connect(t2, SIGNAL(started()), obj1, SLOT(MyThread()));    connect(obj1, SIGNAL(sendStr(QString)), textBrowser, SLOT(setText(QString)));}Test_Thread::~Test_Thread(){    delete layout;    delete textBrowser;    delete widget;    delete t2;    delete obj1;}复制代码//mythread.h#ifndef MYOBJECT_H#define MYOBJECT_H#include<QtCore/QObject>class MyObject :public QObject{    Q_OBJECTpublic:    MyObject();    ~MyObject();    bool thread_run = true;public slots:    void MyThread();private:    signals:    void sendStr(QString);};#endif // MYOBJECT_H复制代码//mythread.cpp#include "mythread.h"#include<QtCore/QThread>  #include<QtCore/QDebug>  MyObject::MyObject(){}MyObject::~MyObject(){}void MyObject::MyThread(){    while (thread_run)    {        QString str = "内存还在泄漏吗?\r\n";        //_sleep(100);        emit sendStr(str);    }}
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38051999 2019-09-19
  • 打赏
  • 举报
回复
没看出来那里有内存泄漏!一个while循环一直在线程里边跑,线程一直都没结束掉,那里来的内存泄漏!
weixin_38067950 2019-09-19
  • 打赏
  • 举报
回复
sendStr(QString);信号也是个函数定义,你需要定义这个形参,不然怎么将实参传输给槽函数
weixin_38068653 2019-09-19
  • 打赏
  • 举报
回复
把QString str移出死循环,立竿见影!
weixin_38073873 2019-09-19
  • 打赏
  • 举报
回复
非要我贴源码void MyObject::MyThread(){  QString str;  while (thread_run) {    str = "内存还在泄漏吗?\r\n";    QThread::msleep(5);    emit sendStr(str);  }}内容来自[短消息]
weixin_38079250 2019-09-19
  • 打赏
  • 举报
回复
你先找找资料看看正确的线程方式是怎么做的吧Qt做线程有两种1、MyObject::QThread重写run函数,在run里while(1)2、MyObject::QObject定义槽函数,槽函数里不要有while(1),槽函数只做一次事情

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧