QTableWidget и QTableWidgetItem, удаляются ли ячейки при QTableWidget::clear(); |
Здравствуйте, гость ( Вход | Регистрация )
QTableWidget и QTableWidgetItem, удаляются ли ячейки при QTableWidget::clear(); |
silver47 |
15.4.2011, 8:09
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Добрый день.
Ячейки создаются таким образом:
Собственно вроде как утечка памяти. Память выделена, объект создан, но указатель на него отсутствует. Что будет с этим объектом, если вызвать метод table->clear(); уничтожиться ли? Вроде не должен(родитель не указан, да даже, если и указан был бы, то он живой и здоровый). следовательно перед clear, нужно уничтожить все созданные ячейки вручную? Как это сделать? Спасибо. UPD.: ячейки не уничтожаются. Необходимо удалять вручную. Есть идеи как это грамотно реализовать? Не таскать же за собой мешок указателей. пока думаю так:
Сообщение отредактировал 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. Это означает, что таблица полностью отвечает за данный элемент, и, соответственно, уничтожит его в случает очистки таблицы, либо удаления самой таблицы.
Такой подход в принципе неверен, существует метод : 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 |
Такой подход в принципе неверен, существует метод : QTableWidgetItem * QTableWidget::takeItem ( int row, int column ) Removes the item at row and column from the table without deleting it. А мне как раз нужно удалить этот элемент, так как позже будут созданы другие, что приведет к утечке памяти. По поводу Это означает, что таблица полностью отвечает за данный элемент, и, соответственно, уничтожит его в случает очистки таблицы, либо удаления самой таблицы. Если я создам QTableWidgetItem и указатель на него, то после удаления элемента указатель куда будет ссылаться? На тот же адрес? Если да, то прошу прощения запутался. Помню что в сях указатели нужно принудительно занулять после удаления элемента, думал Qt это делает сам. Сообщение отредактировал silver47 - 15.4.2011, 8:50 |
|
|
wiz29 |
15.4.2011, 9:53
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Такой подход в принципе неверен, существует метод : QTableWidgetItem * QTableWidget::takeItem ( int row, int column ) Removes the item at row and column from the table without deleting it. А мне как раз нужно удалить этот элемент, так как позже будут созданы другие, что приведет к утечке памяти. Нельзя делать
нужно
По поводу Это означает, что таблица полностью отвечает за данный элемент, и, соответственно, уничтожит его в случает очистки таблицы, либо удаления самой таблицы. Если я создам QTableWidgetItem и указатель на него, то после удаления элемента указатель куда будет ссылаться? На тот же адрес? Если да, то прошу прощения запутался. Помню что в сях указатели нужно принудительно занулять после удаления элемента, думал Qt это делает сам. Qt это не язык программирования, а библиотека, не нужно это путать никогда.... зачем тебе указатель занулять которым ты не пользуешься?... |
|
|
abc |
15.4.2011, 10:18
Сообщение
#5
|
Участник Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: 4 |
посмотри исходники QTableWidget, там работает модель QTableModel, реализация которой в том же файле
когда делаешь clear(), вызывается QTableModel::clearContents():
и, кроме того, когда делаешь setItem, удаляется старая ячейка (метод QTableModel::setItem):
почему ты решил, что не уничтожаются? |
|
|
silver47 |
15.4.2011, 10:20
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
|
|
|
wiz29 |
15.4.2011, 10:37
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
|
|
|
silver47 |
15.4.2011, 11:25
Сообщение
#8
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
почему ты решил, что не уничтожаются? Потому что запутался. Удалил элемент и проверил указатель, который ссылался на него. Указатель по прежнему ссылается на тот же адрес памяти. Вот меня и переклинило что объект не удален. Ты им пользуешься или нет? если не пользуешься, зачем занулять?о_О Нет не пользуюсь. У меня вообще нет указателей на 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 |
посмотри исходники QTableWidget, там работает модель QTableModel, реализация которой в том же файле когда делаешь clear(), вызывается QTableModel::clearContents():
и, кроме того, когда делаешь setItem, удаляется старая ячейка (метод QTableModel::setItem):
почему ты решил, что не уничтожаются? у меня не освобождаєтся память после удаления строк создал приложения в нем есть QTableWidgetItem в конструкторе создаю строк с текстом примерно на 10Мб. приложение хаваєт єту память потом удаляю єти строки а приложения память не освобождаєт!!! |
|
|
Текстовая версия | Сейчас: 27.4.2024, 19:31 |