|
10Qter豆
第一次创建一个窗口并返回后发现内存增加了一点(几百kb左右),之后创建并返回内存就不再增加了。
有没哪位大神知道这个原理啊?
ps:之前在Ubuntu 上发现的这个问题,以为是linux的内存管理机制(cache)。但没想到在windows上也有这个问题
类似问题:
http://www.qter.org/forum.php?mod=viewthread&tid=1030
http://bbs.csdn.net/topics/390341517
测试代码:
main.cpp- #include "mainwindow.h"
- #include <QApplication>
- #include <QLabel>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
复制代码 mainwindow.cpp- #include "mainwindow.h"
- #include "nextpage.h"
- #include <QVBoxLayout>
- #include <QPushButton>
- #include <QLabel>
- #include <QDebug>
- #include <QObjectCleanupHandler>
- MainWindow::MainWindow(QWidget *parent) :
- QWidget(parent)
- {
- qDebug() << "MainWindow::MainWindow";
- }
- MainWindow::~MainWindow()
- {
- qDebug() << "MainWindow::~MainWindow";
- }
- void MainWindow::showEvent(QShowEvent *)
- {
- qDebug() << "MainWindow::showEvent";
- // QObjectCleanupHandler *cleaner=new QObjectCleanupHandler;
- QVBoxLayout *vbox = new QVBoxLayout(this);
- QPushButton *btn = new QPushButton("add text",this);
- QPushButton *btn2 = new QPushButton("creat page",this);
- QPushButton *btn3 = new QPushButton("deletLater page",this);
- QPushButton *btn4 = new QPushButton("delet all",this);
- QLabel *label = new QLabel(this);
- label->setPixmap(QPixmap(":/images/media.svg"));
- vbox->addWidget(btn);
- vbox->addWidget(btn2);
- vbox->addWidget(btn3);
- vbox->addWidget(btn4);
- vbox->addWidget(label);
- vbox->addStretch(1);
- connect(btn,&QPushButton::clicked,[this,vbox](){
- vbox->addWidget(new QLabel("the add label"));
- });
- connect(btn2,&QPushButton::clicked,[this]{
- page = new NextPage();
- // cleaner->add(page);
- page->resize(this->size());
- page->show();
- });
- connect(btn3,&QPushButton::clicked,[this]{
- if(page){
- qDebug("deletlater page");
- page->deleteLater();
- page = NULL;
- }
- });
- connect(btn4,&QPushButton::clicked,[this]{
- // if(cleaner){
- qDebug("delet all");
- // cleaner->deleteLater();
- // }
- });
- }
复制代码 nextpage.cpp- #include "nextpage.h"
- #include <QVBoxLayout>
- #include <QPushButton>
- #include <QDebug>
- NextPage::NextPage(QWidget *parent) : QWidget(parent)
- {
- }
- void NextPage::showEvent(QShowEvent *)
- {
- qDebug() << "NextPage::showEvent";
- QVBoxLayout *vbox = new QVBoxLayout(this);
- QPushButton *btn = new QPushButton("add image ",this);
- QPushButton *btn2 = new QPushButton("this deletLater",this);
- TLabel *label = new TLabel(this);
- label->setPixmap(QPixmap(":/images/media.svg"));
- vbox->addWidget(btn);
- vbox->addWidget(btn2);
- vbox->addWidget(label);
- vbox->addStretch(1);
- for(int i=0;i< 100; i++){
- TLabel *label3 = new TLabel(this);
- label3->setPixmap(QPixmap(":/images/media.svg"));
- vbox->addWidget(label3);
- }
- connect(btn,&QPushButton::clicked,[this,vbox](){
- TLabel *label1 = new TLabel(this);
- label1->setPixmap(QPixmap(":/images/media.svg"));
- vbox->addWidget(label1);
- });
- connect(btn2,&QPushButton::clicked,[this]{
- this->hide();
- this->deleteLater();
- });
- }
- TLabel::TLabel( QWidget *parent) :
- QLabel(parent)
- {
- }
- TLabel::~TLabel()
- {
- qDebug() << "TLabel::~TLabel";
- }
复制代码 头文件:
mainwindow.h- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QWidget>
- class NextPage;
- class MainWindow : public QWidget
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- void showEvent(QShowEvent *);
- private:
- NextPage *page;
- };
- #endif // MAINWINDOW_H
复制代码 nextpage.h- #ifndef NEXTPAGE_H
- #define NEXTPAGE_H
- #include <QWidget>
- #include <QLabel>
- class TLabel :public QLabel
- {
- Q_OBJECT
- public:
- explicit TLabel(QWidget *parent =0);
- ~TLabel();
- };
- class NextPage : public QWidget
- {
- Q_OBJECT
- public:
- explicit NextPage(QWidget *parent = 0);
- void showEvent(QShowEvent *);
- signals:
- public slots:
- };
- #endif // NEXTPAGE_H
复制代码 |
|