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

lzlichun 2017-12-28 10:40: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_OBJECT

public:
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_OBJECT
public:
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);

}
}
...全文
858 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
judesmorning 2018-01-05
  • 打赏
  • 举报
回复
大兄弟,我以前也犯了这个错误,项目做多了就知道咋回事了。 1、 while里面你一直在生成QString对象,说明你编程不够优化。。 酱紫: QString str = "内存还在泄漏吗?\r\n"; while(true) { //emit str; } 2、Qt线程不是你这样做的 如果使用moveToThread这种方式做线程,那么不要在MyObject的槽函数中加while。正确的应该是: MyObject的槽函数只做一次,用于完成一个功能(你这里是emit str),然后外界有一个信号源,信号每发送一次,MyObject的槽函数就执行一次功能。 总结线程的做法就是: MyObject:QThread时:在run里while(1) MyObject:QObject时:不要有while这个东西。。。。 第一次接触来CSDN,第一次答题,说的不好不要怪我
砚昇 2018-01-05
  • 打赏
  • 举报
回复
#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_OBJECT public: Test_Thread(QWidget *parent = 0); ~Test_Thread(); Ui::Test_ThreadClass ui; QWidget *widget; QVBoxLayout *layout;
[code=c]
[/code] QTextBrowser *textBrowser; private: void creat_Label(); QThread * t2 = new QThread(); MyObject * obj1 = new MyObject(); }; 这段代码是何物?从哪看的,有点辣眼睛。 这么写是不是好点 class QVBoxLayout ; class QTextBrowser; class QThread ; class Test_Thread : public QMainWindow { Q_OBJECT public: Test_Thread(QWidget *parent = 0); ~Test_Thread(); private: Ui::Test_ThreadClass ui; QVBoxLayout *layout; QTextBrowser *textBrowser; QThread * t2; };
lzlichun 2018-01-01
  • 打赏
  • 举报
回复
引用 2 楼 huo5896324 的回复:
你加上你那个Sleep之后应该就不会内存暴涨了吧? 你不加的话 线程一直在发送信号一会就把内存占满了。原因的话可能是你前面的函数内存还没来得及释放掉后面你又调用了很多个了
加上sleep()后,只是内存上涨得慢一点,泄漏问题并没解决。
huo5896324 2017-12-28
  • 打赏
  • 举报
回复
你加上你那个Sleep之后应该就不会内存暴涨了吧? 你不加的话 线程一直在发送信号一会就把内存占满了。原因的话可能是你前面的函数内存还没来得及释放掉后面你又调用了很多个了
加盾男爵 2017-12-28
  • 打赏
  • 举报
回复
Test_Thread的析构函数里为什么这样子逐个delete而不是delete ui?

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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