crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Очистка памяти QTableWidgetItem
karik111
  опции профиля:
сообщение 23.9.2011, 15:43
Сообщение #1


Новичок


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

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




Репутация:   0  


Добрый день! Создана таблица с помощью QTableWidget. Заполняется следующим образом:

 for (int k=0; k<10; k++)
    {
        QTableWidgetItem *t = new QTableWidgetItem("1");

        ui->tableWidget->setItem(k,0,t);
    }


Также есть таймер, который через секунду считывает значения с таблицы используя данный код:
void MainWindow::fert()
{
for (int k=0; k<10; k++)
    {
           QString text;
           QTableWidgetItem *t = new QTableWidgetItem();
            t=ui->tableWidget->item(0,0);
            text = t->text();
            if(text == "1")
            {
                n++;
            }

            //delete t;
     }

    v++;
   ui->lineEdit->setText(QString::number(n));
   n=0;
}


После каждого тика, память растет, как очистить память? Делитом не помогает как представлено в коде, выдает ошибку..
Причина редактирования: Используй тег code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.9.2011, 17:53
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(karik111 @ 23.9.2011, 18:43) *
Делитом не помогает как представлено в коде, выдает ошибку..
какую ошибку?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karik111
  опции профиля:
сообщение 23.9.2011, 19:19
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 23.9.2011, 17:53) *
Цитата(karik111 @ 23.9.2011, 18:43) *
Делитом не помогает как представлено в коде, выдает ошибку..
какую ошибку?

Ошибка следующая: "Прекращена работа программы" и закрывает программу вообще
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 23.9.2011, 20:28
Сообщение #4


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

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

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




Репутация:   6  


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

QString text;
QTableWidgetItem *t = new QTableWidgetItem();
t=ui->tableWidget->item(0,0);
text = t->text();
if(text == "1")
{
    n++;
}
delete t;
t =0;

А я бы сделал так:
text = ui->tableWidget->item(0,0).text();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.9.2011, 20:41
Сообщение #5


Профессионал
*****

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

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




Репутация:   44  


Внимательно посмотри на эти строки:
void MainWindow::fert()
{
    ...
        QTableWidgetItem *t = new QTableWidgetItem();
        t=ui->tableWidget->item(0,0);
    ...
}


Здесь ты создаешь объект, о котором сразу забываешь. :)

Сообщение отредактировал BRE - 23.9.2011, 20:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karik111
  опции профиля:
сообщение 24.9.2011, 8:25
Сообщение #6


Новичок


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

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




Репутация:   0  


Цитата(silver47 @ 23.9.2011, 21:28) *
Ну первое, это запустите в режиме деббагинга и дождитесь когда вылетит, а второе - считается хорошим тоном обнулять указатель до создания объекта и после его удаления.

QString text;
QTableWidgetItem *t = new QTableWidgetItem();
t=ui->tableWidget->item(0,0);
text = t->text();
if(text == "1")
{
    n++;
}
delete t;
t =0;

А я бы сделал так:
text = ui->tableWidget->item(0,0).text();

Сделал так как вы сказали, первый раз когда заходит в функцию, все выполняется успешно, а при входе во второй раз, так же завершается ошибкой, и почему то все строки таблицы становятся пустыми

Цитата(silver47 @ 23.9.2011, 21:28) *
Ну первое, это запустите в режиме деббагинга и дождитесь когда вылетит, а второе - считается хорошим тоном обнулять указатель до создания объекта и после его удаления.

QString text;
QTableWidgetItem *t = new QTableWidgetItem();
t=ui->tableWidget->item(0,0);
text = t->text();
if(text == "1")
{
    n++;
}
delete t;
t =0;

А я бы сделал так:
text = ui->tableWidget->item(0,0).text();

Т.е получается нужно заново заполнить таблицу? тогда все работает, но это по моему бред!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Strikevld
  опции профиля:
сообщение 27.9.2011, 15:42
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(karik111 @ 23.9.2011, 19:43) *
Добрый день! Создана таблица с помощью QTableWidget. Заполняется следующим образом:

 for (int k=0; k<10; k++)
    {
        QTableWidgetItem *t = new QTableWidgetItem("1");

        ui->tableWidget->setItem(k,0,t);
    }


Также есть таймер, который через секунду считывает значения с таблицы используя данный код:
void MainWindow::fert()
{
for (int k=0; k<10; k++)
    {
           QString text;
           QTableWidgetItem *t = new QTableWidgetItem();
            t=ui->tableWidget->item(0,0);
            text = t->text();
            if(text == "1")
            {
                n++;
            }

            //delete t;
     }

    v++;
   ui->lineEdit->setText(QString::number(n));
   n=0;
}


После каждого тика, память растет, как очистить память? Делитом не помогает как представлено в коде, выдает ошибку..


Зачем же так усложнять! И кстати BRE прав! Подучи получше что значит указатель в С++
Пиши так

void MainWindow::fert()
{
for (int k=0; k<10; k++)
{
QString text = ui->tableWidget->item(0,0).text();
if(text == "1")
{
n++;
}
}

v++;
ui->lineEdit->setText(QString::number(n));
n=0;
}

;)

Блин пробелы чета стёрлись!
Сам расставь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.9.2011, 17:02
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Strikevld, оформляй сообщения, справка тут
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 10:53