Russian Qt Forum
Ноябрь 18, 2024, 01:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не понимаю C++: почему здесь не течет память?  (Прочитано 3610 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 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 должны стать невалидными, за них никто не поручится. Почему тогда возвращается указатель на данные, которые должны исчезнуть сразу после обращения?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Январь 17, 2014, 22:53 »

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

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

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

Это для локальных переменных, тут объект в куче
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #2 : Январь 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.
Т.е. если юзер не удалит, то будет утечка.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 18, 2014, 11:47 »

Значит надо полагать что clipboard ответит за удаление. Как часто пишут "takes ownership"
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Январь 18, 2014, 12:09 »

запили баг по поводу утечки, это серьёзно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.