returns一个QList的函数

Function which returns a 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 而不是原始指针来避免内存泄漏吗? 请给我一些建议。

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;
    }
}

如果 QList 实例本身是普通指针,则在 QList 中使用 QSharedPointer 毫无意义。一旦松开指向 QList 的指针,就会松开列表中共享指针分配的所有内存。

不需要通过指针传递QList和所有Qt container-classes包括QString。他们在内部使用 shared-pointers,因此从性能角度来看,传递 QList 与传递 QList* 或多或少相同(参见 http://doc.qt.io/qt-5/implicit-sharing.html)。

是否使用QSharedPointers进行包装LMJEntity是具体用法的问题。无论如何,它不会造成伤害。 您的 LMJEntity class 来自 QObject。 QObjects 会自动删除它们的 parents。因此,如果您为 LMJEntity 实例提供 parent,则它们不需要共享指针。

如果不是,它们将是应用程序的 children,永远不会被删除。不仅如此,它们永远不会被任何 memleak-checking 软件检测为内存泄漏。