1

我有以下课程

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

4

2 回答 2

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;
    }
}
于 2015-04-07T05:32:06.510 回答
0

如果实例本身是普通指针,则在QSharedPointer内部使用没有意义。一旦失去指向 的指针,就会失去列表内共享指针分配的所有内存。QListQListQList

不需要传递QList所有 Qt 容器类,包括QString指针。它们在内部使用共享指针,因此QList从性能角度来看,传递 a 与传递大致相同QList*(参见http://doc.qt.io/qt-5/implicit-sharing.html)。

是否使用 QSharedPointers 进行包装LMJEntity是具体用法的问题。无论如何,它不会有害。您的LMJEntity类派生自QObject. QObjects 与它们的父对象一起被自动删除。因此,如果您为LMJEntity实例提供父级,则它们不需要是共享指针。

如果不是,它们将成为应用程序的子项,并且永远不会被删除。不仅如此,任何 memleak 检查软件都不会将它们检测为内存泄漏。

于 2015-04-07T11:54:26.977 回答