2015-04-06 78 views
1

我有以下類該函數返回的QList

class LMJEntity : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(int Id READ getId WRITE setId) 
}; 

class LMJDataMapper : public QObject 
{ 
    Q_OBJECT 

    virtual QList<LMJEntity *> *findAll(LMJPaging *paging){ 
     QList<LMJEntity *> * result = NULL; 
     QSqlQuery query;  
     bool ret;  
     ret = query.exec(sql); 

     if(!ret){ 
      errors = query.lastError().text();  
     }else 
     { 
      result = new QList<LMJEntity *>(); 
      while(query.next()){ 
       result->append(load(query)); 
      } 
     } 

     return result; 
    } 
}; 

這是使用QList正確的方法是什麼?我應該使用QSharedPointer而不是原始指針來避免內存泄漏? 請給我一些建議。

回答

0

有使用QSharedPointerQList內如果QList實例本身是一種正常的指針是沒有意義的。一旦你鬆開指向QList的指針,就會丟失列表中共享指針分配的所有內存。

指針無需通過QList和所有Qt容器類包括QString。他們在內部使用共享指針,所以傳遞QList從性能角度來講差不多是傳遞QList*(請參閱http://doc.qt.io/qt-5/implicit-sharing.html)。

是否使用QSharedPointers來打包LMJEntity是一個具體的用法。無論如何,這不會造成傷害。 您的LMJEntity分類來自QObject。 QObjects會隨父母自動刪除。所以如果你爲你的LMJEntity實例提供一個父項,那麼它們不需要共享指針。

如果不是,他們將是該應用程序的子項,並且不會被刪除。更重要的是,它們不會被任何memleak-checking軟件檢測爲內存泄漏。

0

QList足夠小,所以通常你不需要在堆中爲它分配內存。我會寫這樣的事:

class LMJEntity : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(int Id READ getId WRITE setId) 
}; 
typedef QSharedPointer <LMJEntity> PLMJEntity; 

class LMJDataMapper : public QObject 
{ 
    Q_OBJECT 

    virtual const QList <PLMJEntity> findAll(LMJPaging *paging) { 
     QList <PLMJEntity> result; 
     QSqlQuery query;  
     if (!query.exec(sql)) { 
      errors = query.lastError().text();  
     } else { 
      while (query.next()) { 
       result->append(PLMJEntity(load(query))); 
      } 
     } 
     return result; 
    } 
}