Russian Qt Forum

Программирование => С/C++ => Тема начата: xintrea от Январь 17, 2014, 22:42



Название: Не понимаю C++: почему здесь не течет память?
Отправлено: xintrea от Январь 17, 2014, 22:42
Вот кусок исходника Qt:

Код:
QMimeData *QAndroidPlatformClipboard::mimeData(QClipboard::Mode mode)
{
    ...

    QMimeData *mimeData = new QMimeData();
    mimeData->setText(QtAndroidClipboard::clipboardText());
    return mimeData;
}

Не могу понять следующего: здесь создается объект типа QMimeData, ему выделяется память. Потом с этим объектом что-то делается (setText) и функция возвращает указатель на него.

Вопросы:

1. Почему не течет память? Где delete? Где очищается память, выделенная объекту?

2. Объясните, куда указывает указатель-результат вызова данной функции? Он указывает на созданный в функции объект QMimeData()? Но при выходе из scope это метода, данные объекта QMimeData должны стать невалидными, за них никто не поручится. Почему тогда возвращается указатель на данные, которые должны исчезнуть сразу после обращения?


Название: Re: Не понимаю C++: почему здесь не течет память?
Отправлено: Alex Custov от Январь 17, 2014, 22:53
1. Почему не течет память? Где delete? Где очищается память, выделенная объекту?

Технически она течёт. Не знаю что там в Android, может своя специфика.

2. Объясните, куда указывает указатель-результат вызова данной функции? Он указывает на созданный в функции объект QMimeData()? Но при выходе из scope это метода, данные объекта QMimeData должны стать невалидными

Это для локальных переменных, тут объект в куче


Название: Re: Не понимаю C++: почему здесь не течет память?
Отправлено: kibsoft от Январь 17, 2014, 23:12
Здесь тот же случай, что и в QNAM:
Код:
QNetworkReply * QNetworkAccessManager::get(const QNetworkRequest & request)
Цитировать
Note: After the request has finished, it is the responsibility of the user to delete the QNetworkReply object at an appropriate time. Do not directly delete it inside the slot connected to finished(). You can use the deleteLater() function.
Т.е. если юзер не удалит, то будет утечка.


Название: Re: Не понимаю C++: почему здесь не течет память?
Отправлено: Igors от Январь 18, 2014, 11:47
Значит надо полагать что clipboard ответит за удаление. Как часто пишут "takes ownership"


Название: Re: Не понимаю C++: почему здесь не течет память?
Отправлено: Alex Custov от Январь 18, 2014, 12:09
запили баг по поводу утечки, это серьёзно