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