Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Интересное поведение QShareDataPointer  (Прочитано 3456 раз)
0 Пользователей и 1 Гость смотрят эту тему.
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« : 25-06-2014 06:29 » 

Интересная ситуация получается. (См. код): функция func1 во втором цикле. В момент времени DamagedSection* s = store->getDamagedSection(sect); делает указатель f битым и дельаше все рушится. Понять не могу, почему первый цикл, который полностью идентичен по своей сути (т.е. обращение к члену класса, вызов метода и т.д.) проходит нормально, а второй -- крашит.
func2 же работает нормально, как и ожидается.

Код: (C++ (Qt))
class Store;
class FloodedCGB;
class DamagesSection;

class Foo : public QShareData {
public:
QVector<FloodedCGB> damagedCGBs;
QVector<DamagedSection> damagedSections;
}

class Some {
public:
QVector<QSharedDataPointer<Foo> > getVector() {
return vector;
}

void main() {
Foo* f = getVector().at(i);
func1(f); // Crashes the program
QSharedDataPointer<Foo> f2 = getVector().at(i);
func2(f2); // Doesn't crashes the program
}

vodi func1(Foo* f) {
// some actions with f
for (int i = 0; i < f->damagedCgbs.count(); ++i) {
        QString s = f->damagedCgbs.at(i).getName();
        FloodedCGB* c = store->getDamagedCGB(s);
        c->setState(f->damagedCgbs.at(i).getState());
    }
// some another actions with f
    for (int i = 0; i < d->damagedSections.count(); ++i) {
        QString sect = NUMBER(f->damagedSections.at(i).Number);
        DamagedSection* s = store->getDamagedSection(sect);
        s->Status = f->damagedSections.at(i).Status;
        s->Value = f->damagedSections.at(i).Value;
    }
}

void func2(QSharedDataPointer<Foo> f) {
//  --//--
}

private:
QVector<QSharedDataPointer<Foo> > vector;
Store* store;
}
 
Разница вся в сигнатурах функций func1 и func2: одна использует обычный (тупой Улыбаюсь ) указатель, а другая -- умный.
Некоторые мысли: объект по f в описываемый момент времени не должен удаляться (по причине умных указателей) т.к. умный указатель живет на протяжении вызова обеих функций  Здесь была моя ладья... Вызов деструктора не происходит, в любом случае. Т.е. наверное, где то указатель должен сбиваться, или должно происходить несанкционированное использование той памяти. Я посмотрел: вызов store->getDamagedSection(sect), после которого происходит поломка указателя, возвращает память, непересекающуюся с памятью f.
Без дебагера тоже падает.

Используется qt 4.8.6, debian 7

Старался все как можно больше упростить, не упустив делталей. Буду благодарен, если поможете мне разобраться с интересной ситуацией.
PS. Да и вообще я уже здесь и так много кому благодарен  Улыбаюсь
Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines