Russian Qt Forum
Ноябрь 27, 2024, 13:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Безопасен ли такой код QList<QPushButton*>?  (Прочитано 21652 раз)
usr00210
Гость
« : Август 30, 2010, 05:15 »

Код:
int main( int argc, char *argv[] )
{
    QApplication AppInstance( argc, argv );
    QList<QPushButton*> qPButtonList;

    ...

    AppInstance.exec();

    foreach( QPushButton* pButton, qPButtonList ) // Безопасен ли и вообще правилен ли такой код?
        delete pButton;

    return 0;
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 30, 2010, 06:19 »

Сам контейнер не очищается. Используй лучше.
Код
C++ (Qt)
qDeleteAll (qPButtonList);
qPButtonList.clear ();
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex_cs_gsp
Гость
« Ответ #2 : Август 30, 2010, 08:09 »

КуТ делает копию контейнера при входе в фоич. Следовательно список, который в фоич, будет содержать те же указатели что и список выше. А затем происходит удаление памяти по этим указателям, выходит, что список уже будет содержать не валидные указатели, что уже плохо, даже если отсутствует другой код.
Записан
usr00210
Гость
« Ответ #3 : Август 30, 2010, 09:11 »

Спасибо!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 30, 2010, 13:47 »

КуТ делает копию контейнера при входе в фоич. Следовательно список, который в фоич, будет содержать те же указатели что и список выше.
Будет, но контейнер не копируется, просто применяется константный итератор
Записан
Alex_cs_gsp
Гость
« Ответ #5 : Август 30, 2010, 14:09 »

Что-то Шлее заврался.
Записан
BRE
Гость
« Ответ #6 : Август 30, 2010, 14:33 »

Что-то Шлее заврался.
Не заврался. С точки зрения C++ контейнер будет копироваться во временный объект, но с точки зрения Qt, самого копирования данных не произойдет, временному контейнеру будет присвоен указатель на управляющую структуру контейнера и увеличен счетчик использования. При разрушении временного объекта этот счетчик просто уменьшиться.
Записан
usr00210
Гость
« Ответ #7 : Август 30, 2010, 14:53 »

Что-то Шлее заврался.
Не заврался. С точки зрения C++ контейнер будет копироваться во временный объект, но с точки зрения Qt, самого копирования данных не произойдет, временному контейнеру будет присвоен указатель на управляющую структуру контейнера и увеличен счетчик использования. При разрушении временного объекта этот счетчик просто уменьшиться.

в документации Qt для этого есть специальная терминология deep copy - когда фактически создается дубликать и еще какое-то копирование (термин забыл), когда возвращается указатель и увеличивается счетчик объектов.
Записан
BRE
Гость
« Ответ #8 : Август 30, 2010, 14:54 »

в документации Qt для этого есть специальная терминология deep copy - когда фактически создается дубликать и еще какое-то копирование (термин забыл), когда возвращается указатель и увеличивается счетчик объектов.
Implicit Sharing
Записан
usr00210
Гость
« Ответ #9 : Август 30, 2010, 14:57 »

в документации Qt для этого есть специальная терминология deep copy - когда фактически создается дубликать и еще какое-то копирование (термин забыл), когда возвращается указатель и увеличивается счетчик объектов.
Implicit Sharing

нет, этот термин они используют для спец классов оберток, а тут речь идет именно о механизме копирования shallow copy (нашел!)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Август 30, 2010, 15:02 »

Не мешало бы добавить в документацию что foreach для "не Qt" контейнера (напр std::vector) может окончиться печально
Записан
BRE
Гость
« Ответ #11 : Август 30, 2010, 15:04 »

нет, этот термин они используют для спец классов оберток, а тут речь идет именно о механизме копирования shallow copy (нашел!)
Implicit Sharing - это название самой технологии.
В assistant есть отдельная глава, посвященная ей.
Записан
usr00210
Гость
« Ответ #12 : Август 30, 2010, 15:09 »

Не мешало бы добавить в документацию что foreach для "не Qt" контейнера (напр std::vector) может окончиться печально

а там вроде бы написано, что безопасно можно использовать только Qt контейнеры. вроде бы  Смеющийся
Записан
Alex_cs_gsp
Гость
« Ответ #13 : Август 30, 2010, 15:17 »

Мало верится, что константный итератор реализуется копированием контейнера, т.к обычно операции чтения, для которых он и применяется, выполняются быстрее записи, а так выходит наоборот будет. Ведь использование константного итератора нужно, чтобы отлавливать ошибки при попытки модификации "не модифицируемых" данных на этапе компиляции и не более.
Записан
BRE
Гость
« Ответ #14 : Август 30, 2010, 15:22 »

Мало верится, что константный итератор реализуется копированием контейнера...
Эээ. Как понять "константный итератор реализуется копированием контейнера"?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.181 секунд. Запросов: 23.