Qml / C ++内存泄漏

时间:2016-03-10 00:10:10

标签: c++ qt memory-leaks qml

我有下一个问题,我使用Qt 5.5,并使用C ++和Qml创建一个应用程序,但是在一个Gui中,每秒更新一个模型,内存增长并增长内存,我如何能够阻止增长或管理记忆。

该应用程序工作正常,但问题出在Gui(页面)中,其中更新了一组模型并且每秒刷新gui(发布帖子并且答案更新模型),在这种情况下几分钟内存开始增长(显然没有限制),我将模型更改为C ++(原始版本在qml中,更改为QQmlListProperty类,就像我在这里发布代码),但我没有改变内存使用情况,我尝试在更新过程的每个方法中使用动态对象,结果相同,最后我尝试断开对象的一些通知(只有必需品),但是对内存的控制也失败了。

这里是C ++ QQmlListProperty(QmlListBombs)的标题

class QmlListBombs:public QObject{
   Q_OBJECT
   Q_PROPERTY(QQmlListProperty<BombModel> bombs READ bombs CONSTANT) 
   Q_CLASSINFO("DefaultProperty", "bombs")

  public:
   QmlListBombs(QObject *parent=0);
   QQmlListProperty<BombModel> bombs();
   static void append_bomb(QQmlListProperty<BombModel> *list, BombModel *bmb); 
   static BombModel *bombAt(QQmlListProperty<BombModel> *property, const int index);
  private:
      QList<BombModel*> m_bombs;
  signals:
     void bombsChanged();

应用程序运行时的炸弹数量总是相同的(因为属性是不变的)

这里的方法是bombsAt和构造函数更多

  //QmlListBombs.cpp
  //constructor
  QmlListBombs::QmlListBombs(QObject *parent):QObject(parent)
  {}

  QQmlListProperty<BombModel> QmlListBombs::bombs() {
    return QQmlListProperty<BombModel>this,&m_bombs,&QmlListBombs::bombsSize, &QmlListBombs::bombAt);
       }

   //append function, i not use this funcion to append to list in C++
   void QmlListBombs::append_bomb(QQmlListProperty<BombModel> *list,  BombModel *bmb){
      QmlListBombs *bmbsList=qobject_cast<QmlListBombs *>(list->object);

       if(bmbsList){
         bmb->setParent(bmbsList);
         bmbsList->m_bombs.append(bmb);
       }
      }

      void QmlListBombs::insertBomb(){
           BombModel *newBomb=new BombModel(island);
           newBomb->setParent(this);
           m_bombs.append(newBomb);
       }

       BombModel* QmlListBombs::bombAt(QQmlListProperty<BombModel> *list, const int index){
           return static_cast< QList<BombModel *> *>(list->data)->at(index);
        }

       int QmlListBombs::bombsSize(QQmlListProperty<BombModel> *list){
          return static_cast< QList<BombModel *> *>(list->data)->size();
       }

       //update bomb method, the qjsonobject is from the answer from remote server request
       void QmlListBombs::updateBombs(const QJsonObject &reqStatusPumps){
         int index=0;

          QJsonObject arrayDataStatusReq=reqStatusPumps.value("pumpsList").toObject();
          while(index<sizeQmlListBombs()){
                if(m_bombs.at(index)->getStatusBomb()!=arrayDataStatusReq.value( m_bombs.at(index)->getPumpNumber() ).toInt())
                 m_bombs.at(index)->updateStatusPump( arrayDataStatusReq.value( m_bombs.at(index)->getPumpNumber() ).toInt() );

            index++
      }
    }

   int QmlListBombs::sizeQmlListBombs() const{
       return m_bombs.size();
   }

BombModel的标题和部分方法:

class BombModel: public QObject{
  Q_OBJECT
  Q_PROPERTY(QString numberBomb READ getPumpNumber CONSTANT) 
  Q_PROPERTY(int status READ getStatusBomb NOTIFY statusChange)
  Q_PROPERTY(QString statusName READ getStatusName NOTIFY statusNameChange);
 public:
  void updateStatusPump(const quint16 &_statusPump){
             if(this->status!=_statusPump){
                 this->status=_statusPump;
                 changeStatusName();//this function are only a switch where the status are evaluated
                 emit statusChange();
                 emit statusNameChange();
             }
  }
  int getStatusBomb() const{
      return this->status;
  }
  QString getStatusName() const{
     return this->statusName;
  }
  void BombModel::changeStatusName(){
     switch(status){
       case 0:
         statusName="Out";
         break;
       case 1:
         statusName="Free";
         break;
       case 2:
         statusName="Ocuped";
         break;
       ...
       ...
       default:
         statusName="Error";
         break;
     }  

  private:
   QString numberBomb;
   int status;          
   QString statusName;

  signals:
    void statusChange();
    void statusNameChange();

从之前的型号中只有一些信号,因为有些数据(如numberBomb,永远不会改变,只会改变状态和statusName)。

在主对象中,我将QQmlListProperty列表声明为上下文属性。

view->rootContext();->setContextProperty(QString("listBombs"), listBombs);

获得实际状态的功能是:

QByteArray responseStatus=catchStatus( jsonStatusBombs );

就像我说之前我没有可视化问题一样,更新我的问题就是使用内存。

这是我的Qml文件:

 GridView{                
          width: parent.width; height: parent.height;
          anchors.top: parent.top;
          cellWidth: 174; cellHeight: 117;

          id: arrayBombs;
          model: listBombs.bombs;

          delegate: BombModel{
               numberBomb: model.numberBomb;
               statusBomb: model.status;
               statusText: model.statusName;
         }
  }

0 个答案:

没有答案