crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Удаление объекта из QList, Утечки
QMainWindow
  опции профиля:
сообщение 9.1.2013, 21:27
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вечер добрый.
Есть код:
MyWidget *myWidget = new MyWidget(this);
    myWidgetList.append(myWidget);
    delete myWidget;
Создал некоторый виджет, положил его для удобства в QList, удалил, чтобы не занимал место. Далее этот список попользовал и пришло время удалить из него этот виджет.
myWidgetList.removeAt(i);
Тут вопрос: чтобы этот виджет удалился и из списка, и из памяти, достаточно этой строчки? Или нужно как-нибудь так:
myWidgetList.first().~MyWidget();
myWidgetList.removeAt(i);


PS Ну понятно, что i - это порядковый номер моего виджета, необязательно первый.

Сообщение отредактировал QMainWindow - 9.1.2013, 21:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
quarz
  опции профиля:
сообщение 11.1.2013, 18:57
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


QMainWindow надо обрести понимание указателей, т.к. это полный бред:
Цитата(QMainWindow @ 10.1.2013, 10:28) *
Ну да, это я ошибся. Ну понятно, имелось ввиду создать виджет, положить ЕГО в список, а то, что осталось удалить.

Когда ты создаешь объект (TObject здесь может быть любым типом),
TObject* pObj = new TObject();

он физически размещается в оперативной памяти, а (uint)pObj хранит адрес памяти, по которому разместился объект. Если тебе (вдруг) нужен именно список самих объектов, то так и пишешь:
QList<TObject> myObjectList;
TObject* pObj = new TObject();
myObjectList.append(*pObj);     // необходимо разыменование указателя


А если же тебе нужен список Указателей на объекты, то:
QList<TObject*> myPtrObjectList;
TObject* pObj = new TObject();
myPtrObjectList.append(pObj);

и здесь удалять тоже ничего не нужно: переменная pObj исчезнет, когда будет покинута ее область видимости, а сам объект *pObj, тебе нужно будет удалить перед удалением его из списка:
delete myPtrObjectList[i];
myPtrObjectList.removeAt(i);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 14.1.2013, 7:12
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(quarz @ 11.1.2013, 19:57) *
Когда ты создаешь объект (TObject здесь может быть любым типом),
TObject* pObj = new TObject();

он физически размещается в оперативной памяти, а (uint)pObj хранит адрес памяти, по которому разместился объект. Если тебе (вдруг) нужен именно список самих объектов, то так и пишешь:
QList<TObject> myObjectList;
TObject* pObj = new TObject();
myObjectList.append(*pObj);     // необходимо разыменование указателя


Во первых, у человека производный от Widget, который имеет запрет на конструктор копирования, поэтому этот номер даже не скомпилируется.
Во вторых, объект, созданный через new, нигде не удаляется, следовательно - утечки памяти.

Цитата(quarz @ 11.1.2013, 19:57) *
А если же тебе нужен список Указателей на объекты, то:
QList<TObject*> myPtrObjectList;
TObject* pObj = new TObject();
myPtrObjectList.append(pObj);

и здесь удалять тоже ничего не нужно: переменная pObj исчезнет, когда будет покинута ее область видимости, а сам объект *pObj, тебе нужно будет удалить перед удалением его из списка:
delete myPtrObjectList[i];
myPtrObjectList.removeAt(i);


В третих, удаление самого объекта и есть то, что всегда нужно удалять, поэтому непонятна фраза "и здесь удалять тоже ничего не нужно".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 11:26