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 软件检测为内存泄漏。
我有以下类
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 软件检测为内存泄漏。