crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QTableWidget и QTableWidgetItem, удаляются ли ячейки при QTableWidget::clear();
silver47
  опции профиля:
сообщение 15.4.2011, 8:09
Сообщение #1


Активный участник
***

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

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




Репутация:   6  


Добрый день.

Ячейки создаются таким образом:
table = new QTableWidget();
table->setItem(0, 0, new QTableWidgetItem("Hello World!"));


Собственно вроде как утечка памяти. Память выделена, объект создан, но указатель на него отсутствует. Что будет с этим объектом, если вызвать метод table->clear(); уничтожиться ли? Вроде не должен(родитель не указан, да даже, если и указан был бы, то он живой и здоровый). следовательно перед clear, нужно уничтожить все созданные ячейки вручную? Как это сделать?

Спасибо.

UPD.: ячейки не уничтожаются. Необходимо удалять вручную. Есть идеи как это грамотно реализовать? Не таскать же за собой мешок указателей.

пока думаю так:
QTableWidgetItem *pItem;

// это в цикле в зависимости от размеров таблицы
    pItem = table->item(x, y);
    delete pItem;
//


Сообщение отредактировал silver47 - 15.4.2011, 8:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 15.4.2011, 8:32
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


void QTableWidget::setItem ( int row, int column, QTableWidgetItem * item )
Sets the item for the given row and column to item.
The table takes ownership of the item.
Это означает, что таблица полностью отвечает за данный элемент, и, соответственно, уничтожит его в случает очистки таблицы, либо удаления самой таблицы.

Цитата(silver47 @ 15.4.2011, 9:09) *
QTableWidgetItem *pItem;

// это в цикле в зависимости от размеров таблицы
    pItem = table->item(x, y);
    delete pItem;
//


Такой подход в принципе неверен, существует метод :
QTableWidgetItem * QTableWidget::takeItem ( int row, int column )
Removes the item at row and column from the table without deleting it.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 15.4.2011, 8:41
Сообщение #3


Активный участник
***

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

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




Репутация:   6  


Цитата(wiz29 @ 15.4.2011, 10:32) *
Такой подход в принципе неверен, существует метод :
QTableWidgetItem * QTableWidget::takeItem ( int row, int column )
Removes the item at row and column from the table without deleting it.


А мне как раз нужно удалить этот элемент, так как позже будут созданы другие, что приведет к утечке памяти.
По поводу
Цитата(wiz29 @ 15.4.2011, 10:32) *
Это означает, что таблица полностью отвечает за данный элемент, и, соответственно, уничтожит его в случает очистки таблицы, либо удаления самой таблицы.


Если я создам QTableWidgetItem и указатель на него, то после удаления элемента указатель куда будет ссылаться? На тот же адрес? Если да, то прошу прощения запутался. Помню что в сях указатели нужно принудительно занулять после удаления элемента, думал Qt это делает сам.

Сообщение отредактировал silver47 - 15.4.2011, 8:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 15.4.2011, 9:53
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


Цитата(silver47 @ 15.4.2011, 9:41) *
Цитата(wiz29 @ 15.4.2011, 10:32) *
Такой подход в принципе неверен, существует метод :
QTableWidgetItem * QTableWidget::takeItem ( int row, int column )
Removes the item at row and column from the table without deleting it.


А мне как раз нужно удалить этот элемент, так как позже будут созданы другие, что приведет к утечке памяти.


Нельзя делать
pItem = table->item(x, y);
delete pItem;


нужно
pItem = table->takeItem(x, y);
delete pItem;


По поводу
Цитата(wiz29 @ 15.4.2011, 10:32) *
Это означает, что таблица полностью отвечает за данный элемент, и, соответственно, уничтожит его в случает очистки таблицы, либо удаления самой таблицы.


Цитата(silver47 @ 15.4.2011, 9:41) *
Если я создам QTableWidgetItem и указатель на него, то после удаления элемента указатель куда будет ссылаться? На тот же адрес? Если да, то прошу прощения запутался. Помню что в сях указатели нужно принудительно занулять после удаления элемента, думал Qt это делает сам.


Qt это не язык программирования, а библиотека, не нужно это путать никогда.... зачем тебе указатель занулять которым ты не пользуешься?...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 15.4.2011, 10:18
Сообщение #5


Участник
**

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

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




Репутация:   4  


посмотри исходники QTableWidget, там работает модель QTableModel, реализация которой в том же файле
когда делаешь clear(), вызывается QTableModel::clearContents():
for (int i = 0; i < tableItems.count(); ++i) {
        if (tableItems.at(i)) {
            tableItems.at(i)->view = 0;
            delete tableItems.at(i);
            tableItems[i] = 0;
        }
    }
    reset();


и, кроме того, когда делаешь setItem, удаляется старая ячейка (метод QTableModel::setItem):
QTableWidgetItem *oldItem = tableItems.at(i);
    if (item == oldItem)
        return;

    // remove old
    if (oldItem)
        oldItem->view = 0;
    delete tableItems.at(i);


почему ты решил, что не уничтожаются?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 15.4.2011, 10:20
Сообщение #6


Активный участник
***

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

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




Репутация:   6  


Цитата(wiz29 @ 15.4.2011, 11:53) *
зачем тебе указатель занулять которым ты не пользуешься?...


Тот, который ссылается на объект который еще не создан, или уже удален.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 15.4.2011, 10:37
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


Цитата(silver47 @ 15.4.2011, 11:20) *
Цитата(wiz29 @ 15.4.2011, 11:53) *
зачем тебе указатель занулять которым ты не пользуешься?...


Тот, который ссылается на объект который еще не создан, или уже удален.


Ты им пользуешься или нет? если не пользуешься, зачем занулять?о_О
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 15.4.2011, 11:25
Сообщение #8


Активный участник
***

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

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




Репутация:   6  


Цитата(abc @ 15.4.2011, 12:18) *
почему ты решил, что не уничтожаются?


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

Цитата(wiz29 @ 15.4.2011, 12:37) *
Ты им пользуешься или нет? если не пользуешься, зачем занулять?о_О


Нет не пользуюсь. У меня вообще нет указателей на QTableWidgetItem. Сделал один для проверки, происходит ли удаление элемента при очистке таблицы, да и переклинило меня, что после удаления объекта указатель должен быть занулен. Теперь вспомнил что сам это делал всегда.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 15.4.2011, 11:42
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


ну со всеми бывает, завтра выходной, нужно отдыхать:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dima1985
  опции профиля:
сообщение 14.10.2011, 21:19
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 14.10.2011
Пользователь №: 2943

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




Репутация:   0  


Цитата(abc @ 15.4.2011, 10:18) *
посмотри исходники QTableWidget, там работает модель QTableModel, реализация которой в том же файле
когда делаешь clear(), вызывается QTableModel::clearContents():
for (int i = 0; i < tableItems.count(); ++i) {
        if (tableItems.at(i)) {
            tableItems.at(i)->view = 0;
            delete tableItems.at(i);
            tableItems[i] = 0;
        }
    }
    reset();


и, кроме того, когда делаешь setItem, удаляется старая ячейка (метод QTableModel::setItem):
QTableWidgetItem *oldItem = tableItems.at(i);
    if (item == oldItem)
        return;

    // remove old
    if (oldItem)
        oldItem->view = 0;
    delete tableItems.at(i);


почему ты решил, что не уничтожаются?


у меня не освобождаєтся память после удаления строк

создал приложения в нем есть QTableWidgetItem в конструкторе создаю строк с текстом примерно на 10Мб. приложение хаваєт єту память потом удаляю єти строки а приложения память не освобождаєт!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.4.2024, 19:31