Удаление объекта из QList, Утечки |
Здравствуйте, гость ( Вход | Регистрация )
Удаление объекта из QList, Утечки |
QMainWindow |
9.1.2013, 21:27
Сообщение
#1
|
Участник Группа: Участник Сообщений: 198 Регистрация: 1.8.2010 Пользователь №: 1922 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вечер добрый.
Есть код: Создал некоторый виджет, положил его для удобства в QList, удалил, чтобы не занимал место. Далее этот список попользовал и пришло время удалить из него этот виджет. Тут вопрос: чтобы этот виджет удалился и из списка, и из памяти, достаточно этой строчки? Или нужно как-нибудь так:
PS Ну понятно, что i - это порядковый номер моего виджета, необязательно первый. Сообщение отредактировал QMainWindow - 9.1.2013, 21:29 |
|
|
iReset |
10.1.2013, 9:15
Сообщение
#2
|
Участник Группа: Участник Сообщений: 178 Регистрация: 6.6.2012 Пользователь №: 3414 Спасибо сказали: 23 раз(а) Репутация: 2 |
Есть код: Уже неправильно. В QList ты сохранил только указатель на виджет, за сам виджет отвечаешь ты, он не сохраняется в myWidgetList. Следовательно, после того как ты удалил виджет myWidget, указатель в myWidgetList остался, но стал указывать на нераспределённую память, в которой ранее был твой виджет. Формально его уже нет и что там по этому участку памяти, неизвестно. delete тут делать не надо.
...как-нибудь так: Так вообще никогда делать не надо! Вызов деструктора без удаления самого объекта может привести к непредсказуемым результатам.
Если делал new, то для удаления виджета делай delete, т.е. так: Это удалит сам виджет. А removeAt удалит только указатель на виджет из QList. Т.е. тебе нужно сделать что-то вроде
|
|
|
QMainWindow |
10.1.2013, 9:28
Сообщение
#3
|
Участник Группа: Участник Сообщений: 198 Регистрация: 1.8.2010 Пользователь №: 1922 Спасибо сказали: 0 раз(а) Репутация: 0 |
Уже неправильно. В QList ты сохранил только указатель на виджет, за сам виджет отвечаешь ты, он не сохраняется в myWidgetList. Следовательно, после того как ты удалил виджет myWidget, указатель в myWidgetList остался, но стал указывать на нераспределённую память, в которой ранее был твой виджет. Формально его уже нет и что там по этому участку памяти, неизвестно. delete тут делать не надо. Ну да, это я ошибся. Ну понятно, имелось ввиду создать виджет, положить ЕГО в список, а то, что осталось удалить. Это удалит сам виджет. А removeAt удалит только указатель на виджет из QList. Т.е. тебе нужно сделать что-то вроде
Спасибо. |
|
|
ssoft |
10.1.2013, 11:36
Сообщение
#4
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
Рекомендую использовать умные указатели, тогда вообще не нужно заморачиваться с удалениями, код будет понятнее и не будет приводить к утечкам памяти, например, в случае исключений.
Что-то вроде
Сообщение отредактировал ssoft - 10.1.2013, 11:38 |
|
|
quarz |
11.1.2013, 18:57
Сообщение
#5
|
Студент Группа: Участник Сообщений: 49 Регистрация: 3.11.2009 Пользователь №: 1202 Спасибо сказали: 5 раз(а) Репутация: 0 |
QMainWindow надо обрести понимание указателей, т.к. это полный бред:
Ну да, это я ошибся. Ну понятно, имелось ввиду создать виджет, положить ЕГО в список, а то, что осталось удалить. Когда ты создаешь объект (TObject здесь может быть любым типом),
он физически размещается в оперативной памяти, а (uint)pObj хранит адрес памяти, по которому разместился объект. Если тебе (вдруг) нужен именно список самих объектов, то так и пишешь:
А если же тебе нужен список Указателей на объекты, то:
и здесь удалять тоже ничего не нужно: переменная pObj исчезнет, когда будет покинута ее область видимости, а сам объект *pObj, тебе нужно будет удалить перед удалением его из списка:
|
|
|
ssoft |
14.1.2013, 7:12
Сообщение
#6
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
Когда ты создаешь объект (TObject здесь может быть любым типом),
он физически размещается в оперативной памяти, а (uint)pObj хранит адрес памяти, по которому разместился объект. Если тебе (вдруг) нужен именно список самих объектов, то так и пишешь:
Во первых, у человека производный от Widget, который имеет запрет на конструктор копирования, поэтому этот номер даже не скомпилируется. Во вторых, объект, созданный через new, нигде не удаляется, следовательно - утечки памяти. А если же тебе нужен список Указателей на объекты, то:
и здесь удалять тоже ничего не нужно: переменная pObj исчезнет, когда будет покинута ее область видимости, а сам объект *pObj, тебе нужно будет удалить перед удалением его из списка:
В третих, удаление самого объекта и есть то, что всегда нужно удалять, поэтому непонятна фраза "и здесь удалять тоже ничего не нужно". |
|
|
Текстовая версия | Сейчас: 25.11.2024, 9:22 |