Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тонкие моменты Qt-овских shared классов, Неожиданный финт QList 
:(
    Опции темы
_GRIN_
Дата 9.2.2012, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Вообщем то если вдуматься в то, что такое QList и другие shared classes в Qt, то всё вроде правильно, но сначала поведение следующего алгоритма меня удивили =)
Решил выложить, может ещё кто наткнётся =)
Код

#include <QList>
#include <QDebug>
int main()
{
    QList<int>list1;
    list1 << 1 << 2;
    int*p = &list1[0];
    QList<int>list2 = list1;
    *p = 3;
    qDebug() << list1;
    qDebug() << list2;
    return 0;
}


вывод
Код

(3, 2) 
(3, 2) 


Сначала было неожидано, что изменилось значение во втором списке (а как же copy-on-write) - но затем всё встало на свои места =)


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
bsa
Дата 9.2.2012, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



_GRIN_, а если строки 7 и 8 местами поменять, все нормально будет?
PM   Вверх
alexvs11
Дата 9.2.2012, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



логично, стремновато правда както выглядит, типа доступ к элементам только методами самого листа smile 
PM MAIL   Вверх
_GRIN_
Дата 10.2.2012, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Цитата(bsa @  9.2.2012,  20:52 Найти цитируемый пост)
_GRIN_, а если строки 7 и 8 местами поменять, все нормально будет? 

Да, ты абсолютно прав. =)
Вообщем я тут слегка тест допилил, что бы было нагляднее.
Код

#include <QList>
#include <QDebug>
int main()
{
    //If pointer was created before shadow-copy, then copy-on-write
    // will not be performed.
    QList<int>list1_1;
    list1_1 << 1;
    int*p1 = &list1_1[0];
    QList<int>list1_2 = list1_1;
    *p1 = 3;
    qDebug() << "test_case_1:\t" << list1_1 << list1_2;

    //If pointer was created after shadow-copy, then copy-on-write
    // will be performed.
    QList<int>list2_1;
    list2_1 << 1;
    QList<int>list2_2 = list2_1;
    int*p2 = &list2_1[0];
    *p2 = 3;
    qDebug() << "test_case_2:\t" << list2_1 << list2_2;

    //If pointer was created before shadow-copy, then copy-on-write
    // will not be performed ... until data will not be changed
    // by other way.
    QList<int>list3_1;
    list3_1 << 1;
    int*p3_1 = &list3_1[0];
    QList<int>list3_2 = list3_1;
    *p3_1 = 3;
    qDebug() << "test_case_3_1:\t" << list3_1 << list3_2;
    int*p3_2 = &list3_1[0];
    qDebug() << "test_case_3_2:\t" << list3_1 << list3_2;
    *p3_2 = 5;
    qDebug() << "test_case_3_3:\t" << list3_1 << list3_2;

    QList<int>list4_1;
    list4_1 << 1;
    int*p4_1 = &list4_1[0];
    QList<int>list4_2 = list4_1;
    *p4_1 = 3;
    qDebug() << "test_case_4_1:\t" << list4_1 << list4_2;
    list4_1[0] = 10;
    qDebug() << "test_case_4_2:\t" << list4_1 << list4_2;

    QList<int>list5_1;
    list5_1 << 1;
    int*p5_1 = &list5_1[0];
    QList<int>list5_2 = list5_1;
    *p5_1 = 3;
    qDebug() << "test_case_5_1:\t" << list5_1 << list5_2;
    list5_2[0] = 10;
    qDebug() << "test_case_5_2:\t" << list5_1 << list5_2;

    return 0;
}


Вот лог:
Код

test_case_1:     (3) (3) 
test_case_2:     (3) (1) 
test_case_3_1:     (3) (3) 
test_case_3_2:     (3) (3) 
test_case_3_3:     (5) (3) 
test_case_4_1:     (3) (3) 
test_case_4_2:     (10) (3) 
test_case_5_1:     (3) (3) 
test_case_5_2:     (3) (10) 


В принципе я так думаю, что это всё-таки баг. Положил в багтреккер
https://bugreports.qt-project.org/browse/QTBUG-24215



Это сообщение отредактировал(а) _GRIN_ - 10.2.2012, 07:56


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
borisbn
Дата 10.2.2012, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



_GRIN_, не знаю, видел ты или нет, но в багтрекере код выглядит вот так
user posted image


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 10.2.2012, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Если полученный указатель на элемент не использовать сразу, можно в определённых случаях получить обращение к недействительной памяти и вылет программы (возможно, не сразу, а в непонятном месте)
PM   Вверх
_GRIN_
Дата 10.2.2012, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



borisbn, видел - я там файл main.cpp приатачил.
math64, это понятно, но суть в другом - copy-on-write работает не всегда.


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
mes
Дата 10.2.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(_GRIN_ @  10.2.2012,  08:17 Найти цитируемый пост)
 это понятно, но суть в другом - copy-on-write работает не всегда. 

COW не волшебство и работает только когда его "просят", а именно при неконстантном обращении к объекту.. 
В примере применение оператора[] происходит до какого нибудь дублирования списка, а соответсвенно "отпочковывать" просто нечего.. 
А когда уже есть, то нет повода (применения [])

Добавлено через 3 минуты и 55 секунд
кстати попробуйте вставить между восьмой и 9 строчкой еще раз получение ссылки первого списка.. 
тогда первая ссылка (первого списка) будет менять только у второго списка smile



Это сообщение отредактировал(а) mes - 10.2.2012, 09:34


--------------------
PM MAIL WWW   Вверх
_GRIN_
Дата 10.2.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



mes, ты абсолютно прав =)
Я тока собирался написать, а ты уже =)
Не баг это (на багтрекере повинился) - просто тонкий момент, о котором не стоит забывать.
"Implicit sharing automatically detaches the object from a shared block if the object is about to change and the reference count is greater than one."


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.