• 1129阅读
  • 10回复

[提问]求证:Qt-5.15 最新开源版本是否依然存在内存(软)泄露? [复制链接]

上一主题 下一主题
离线liulg
 

只看楼主 倒序阅读 楼主  发表于: 2023-05-11
QTBUG-88248 存在于 Qt-5.15 初期版本中,Qt-5.15.6 声称已经解决了这个问题
最近一年多主要使用由论坛里 @fsu0413(感谢大佬的贡献) 发布的  Qt5.15.*-Windows-x86_64-VS2019 版本,
但包括最近发布的 Qt-5.15.9 版本,似乎 QTBUG-88248 这个问题还是存在,使用的测试代码是在 QTBUG-87774 的代码的基础上修改的。
PID 13768 用的是自编译的 Qt-5.9.9-Windows-x86_64-VS2019-16.11.26,这个版本测试期间内存占用很稳定,
PID 1220 用的是 fsu0413 最近发布的 Qt5.15.9-Windows-x86_64-VS2019-16.11.26-20230507.7z :

因此不确定 Qt 针对 Qt-5.15 开源的代码中是否有针对 QTBUG-88248 的修复补丁,
求助论坛里有使用 Qt-5.15 版本(特别是使用商业闭源版本)或参与 Qt 开发的朋友帮助确认一下这个问题的是否依然存在。
测试代码:
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class MainWindow; }
  6. QT_END_NAMESPACE
  7. class QToolBar;
  8. class QPushButton;
  9. class MainWindow : public QMainWindow
  10. {
  11.     Q_OBJECT
  12. public:
  13.     MainWindow(QWidget *parent = nullptr);
  14.     ~MainWindow();
  15. public slots:
  16.     void refresh_toolbar();
  17.     void update_count( bool del = false );
  18.     void update_count_and_delete();
  19. private:
  20.     Ui::MainWindow *ui;
  21.     QToolBar *tb;
  22.     QPushButton * pb;
  23. };
  24. #endif // MAINWINDOW_H
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QToolBar>
  4. #include <QTimer>
  5. #include <QPushButton>
  6. MainWindow::MainWindow(QWidget *parent)
  7.     : QMainWindow(parent)
  8.     , ui(new Ui::MainWindow),
  9.     tb(  nullptr ),
  10.     pb( new QPushButton(this) )
  11. {
  12.     ui->setupUi(this);
  13.     setCentralWidget(pb);
  14.     pb->setText(QLatin1String("Push me to start the test"));
  15.     connect(pb, SIGNAL(clicked(bool)), this, SLOT(refresh_toolbar()));
  16. }
  17. MainWindow::~MainWindow()
  18. {
  19.     delete ui;
  20. }
  21. void MainWindow::update_count( bool del )
  22. {
  23.     pb->setText( tr("Actions : %1").arg( tb->children().count() ) );
  24.     if( del )
  25.     {
  26.         removeToolBar( tb );
  27.         tb->deleteLater();
  28.         tb = nullptr;
  29.     }
  30. }
  31. void MainWindow::update_count_and_delete()
  32. {
  33.     update_count(true);
  34. }
  35. void MainWindow::refresh_toolbar()
  36. {
  37.     static int gg = 0;
  38.     if( tb )
  39.     {
  40.         // This would release those actions and free the memory,
  41.         // Qt-5.9.9s build with mingw32 and msvc-2019 do that OK,
  42.         // Qt-5.12.9-msvc2019 and Qt-5.15.1-msvc2019 leaks memory
  43.         QList<QAction*> acts = tb->actions();
  44.         foreach (QAction* act, acts) {
  45.             tb->removeAction(act);
  46.             delete act;
  47.         }
  48.     }
  49.     else
  50.     {
  51.         tb = new QToolBar(this);
  52.         addToolBar( tb );
  53.         update_count();
  54.     }
  55.     // Here actions's memory may not be released!
  56.     tb->clear();
  57.     if( gg++ < 1000 )
  58.     {
  59.         for(int i = 0; i < 100; ++i)
  60.         {
  61.             int title = gg * 1000 + i;
  62.             tb->addAction(QString::number(title));
  63.         }
  64.         QTimer::singleShot(10, this, SLOT(refresh_toolbar()));
  65.     }
  66.     else
  67.     {
  68.         // remove and delete the toolbar
  69.         QTimer::singleShot(10, this, SLOT(update_count_and_delete()));
  70.         gg = 0;
  71.     }
  72. }



离线fsu0413

只看该作者 1楼 发表于: 2023-05-11
离线fsu0413

只看该作者 2楼 发表于: 2023-05-11
(还有 我TM被背刺了,列表上又多了个patch。。。。
离线liulg

只看该作者 3楼 发表于: 2023-05-11

上面的测试用例是针对 QTBUG-88248 的,这个问题在 Qt-5.15.6 版本应该是已经解决了的,也就是说在 Qt-5.15.6 包括其后的版本应该已经包含了对 这个问题的修复代码,所以这个问题不应该在  5.15.7 、 5.15.8 中存在才对。早前我曾经自己编译过 Qt-5.15.7,但依然能复现这个问题,我的机器太老了,每编译一次都是很痛苦的事情,除了 Qt-5.9.9 ,Qt-5.15 版本在后来就一直用大佬的发布包了。

现在担心的是 Qt 公司发布的 Qt-5.15 的源代码包中可能并不包含  QTBUG-88248  相关的修复。
离线toby520

只看该作者 4楼 发表于: 2023-05-12
我最新的商业版本5.15.10 并不包含修复的代码
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线toby520

只看该作者 5楼 发表于: 2023-05-12
再次求证 5.15.13上面 也无此代码
可能是以下说明的原因
https://codereview.qt-project.org/c/qt/qtbase/+/320789?tab=comments
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线liulg

只看该作者 6楼 发表于: 2023-05-12
这样看来,Qt 公司名义上的择时发布的长期支持版本的源代码仅仅是“无奈”的“作秀”,或是为了“应付”社区?
当然了,它们现在是完全商业运营了,义务上讲可能也没有必要迎合社区,但不应该糊弄客户或社区。
离线liulg

只看该作者 7楼 发表于: 2023-05-12
QTBUG-88248 让 Qt-5.12 ~ Qt-5.15 分支的所有 Qt 版本几乎不可信或不可用,真不敢相信商业版本的源码包中也不包含这个问题的修复代码。
离线angelus

只看该作者 8楼 发表于: 2023-06-15
看过最新的5.15.10的源代码了,好像已经包含了补丁修改的代码,你可以试试
离线liulg

只看该作者 9楼 发表于: 2023-06-15
回 angelus 的帖子
angelus:看过最新的5.15.10的源代码了,好像已经包含了补丁修改的代码,你可以试试 (2023-06-15 10:50) 

已验证 @fsu0413   大佬最新发布的 5.15.10 的包已经没有 QTBUG-88248 这个问题了,感谢!
本帖提到的人: @fsu0413
离线fsu0413

只看该作者 10楼 发表于: 2023-06-17
回 liulg 的帖子
liulg:已验证 @fsu0413     大佬最新发布的 5.15.10 的包已经没有 QTBUG-88248 这个问题了,感谢! (2023-06-15 12:06) 

源码都是Qt的。。。
本帖提到的人: @fsu0413
快速回复
限100 字节
 
上一个 下一个