返回QList的函数

时间:2015-04-06 23:38:25

标签: c++ qt qlist qsharedpointer

我有以下课程

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

没有必要通过指针传递QList和所有Qt容器类,包括QString。他们在内部使用共享指针,因此从性能角度传递QList或多或少与传递QList*相同(参见http://doc.qt.io/qt-5/implicit-sharing.html)。

使用QSharedPointers包装LMJEntity是一个具体用法问题。无论如何,它不会造成伤害。 您的LMJEntity课程来自QObject。 QObjects将与其父项自动删除。因此,如果您为LMJEntity个实例提供父级,则不必将它们作为共享指针。

如果没有,他们将成为申请的子女,永远不会被删除。更重要的是,任何memleak检查软件都不会将它们检测为内存泄漏。