我有以下课程
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 :(得分: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检查软件都不会将它们检测为内存泄漏。