Функция, которая возвращает 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
вместо необработанного указателя, чтобы избежать утечки памяти? Пожалуйста, дайте мне несколько предложений.
2 ответа
Нет смысла использовать QSharedPointer
внутри QList
если QList
Сам экземпляр является нормальным указателем. Как только вы потеряете указатель на QList
вы теряете всю память, выделенную общими указателями внутри списка.
Не надо проходить QList
и все контейнерные классы Qt, включая QString
по указателям. Они используют общие указатели внутри, поэтому, передавая QList
с точки зрения производительности более или менее так же, как прохождение QList*
(см. http://doc.qt.io/qt-5/implicit-sharing.html).
Используете ли QSharedPointers для упаковки LMJEntity
это вопрос конкретного использования. В любом случае это не повредит. Ваш LMJEntity
класс является производным от QObject
, QObjects автоматически удаляются вместе с их родителями. Так что, если вы предоставите родителя для вашего LMJEntity
экземпляры, чем они не должны быть общими указателями.
Если нет, они будут дочерними элементами приложения и никогда не будут удалены. Более того, они никогда не будут обнаружены как утечки памяти никаким программным обеспечением для проверки утечки памяти.
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;
}
}